【发布时间】:2021-01-08 03:43:12
【问题描述】:
我有很多课程,例如DataFrameFlow、TextFlow、RDDFlow。它们都派生自基类Flow。
现在我想编写一个函数judgeFlow,它可以从path: String 中读取并返回代表确切Flow 类型的东西,我可以从中创建相应的实例。整个代码如下所示
def judgeFlow(path:String) = /*1*/ {
Flow.getStoreType(path) match {
case StoreType.tdw =>
DataFrameFlow
case StoreType.hdfs =>
TextFlow
}
}
def createFlow(typeInfo:/*2*/) = /*3*/{
new typeInfo()
}
但是,我不知道如何在位置 1、2 和 3 中写。
编辑
在这里知道如何构造它们是不够的,因为我还想要以下内容:
- 通过
typeInfo进行模式匹配 - 一些方法
asInstanceOf
编辑 2
Flow的定义
abstract class Flow(var outputName: String) extends Serializable{
def this() = this("")
...
}
DataFrameFlow的定义
class DataFrameFlow(d: DataFrame, path: String) extends Flow {
var data: DataFrame = d
def this(data: DataFrame) = this(data, "")
def this(path: String) = this(null, path)
def this() = this(null, "")
...
}
【问题讨论】:
-
如果您打算对事物做的只是构造它,您可以考虑返回一个 0 元函数来进行构造。
-
@SilvioMayolo 做建筑还不够,我还需要 asInstanceOf 的东西
-
您的示例不具有代表性,您的课程怎么样(
Flow,DataFrameFlow等)?例如case class Flow(id: Int, ....),也可以提供一些数据示例。 -
@Chema 他们的定义太大了,我认为他们无关紧要。
Flow是一个抽象类,DataFrameFlow继承了它。我正在尝试提供更详细的代码,但这需要一些时间 -
嗨@calvin,如果它们是案例类,您可以进行模式匹配来构建您的对象。
标签: scala reflection types pattern-matching scala-reflect