在scala中是否有某种方法可以返回类型?
我有很多类,比如在scala中是否有某种方法可以返回类型?,scala,reflection,types,pattern-matching,scala-reflect,Scala,Reflection,Types,Pattern Matching,Scala Reflect,我有很多类,比如DataFrameFlow,TextFlow,RDDFlow。它们都派生自基类流 现在我想编写一个函数judgeFlow,它可以从path:String读取,并返回表示确切Flow类型的内容,我可以从中创建相应的实例。整个代码如下所示 def judgeFlow(path:String) = /*1*/ { Flow.getStoreType(path) match { case StoreType.tdw => DataFrameFlow
DataFrameFlow
,TextFlow
,RDDFlow
。它们都派生自基类流
现在我想编写一个函数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
流的定义
abstract class Flow(var outputName: String) extends Serializable{
def this() = this("")
...
}
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, "")
...
}
数据帧流的定义
abstract class Flow(var outputName: String) extends Serializable{
def this() = this("")
...
}
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, "")
...
}
模式匹配不能从不同的情况返回不同的类型。模式匹配返回的类型是案例中返回的类型的最小上限
当某人想要返回不同的类型时,很可能他/她想要一个类型类
sealed abstract class Flow
class DataFrameFlow extends Flow
class TextFlow extends Flow
class RDDFlow extends Flow
trait JudgeFlow[In] {
type Out <: Flow
def judgeFlow(in: In): Out
}
object JudgeFlow {
implicit val `case1`: JudgeFlow[???] { type Out = DataFrameFlow } = ???
implicit val `case2`: JudgeFlow[???] { type Out = TextFlow } = ???
implicit val `case3`: JudgeFlow[???] { type Out = RDDFlow } = ???
}
def judgeFlow[In](in: In)(implicit jf: JudgeFlow[In]): jf.Out = jf.judgeFlow(in)
如果你打算用它来构建它,你可以考虑返回一个0元函数来构造它。“SilvioMayolo做结构是不够的,我需要一些东西来代替你的例子,你的例子不是代表性的,你的类是什么(<代码>流<代码>,<代码> DataFrameFlow < /代码>等)?例如case类流(id:Int,…)
一些数据示例也可以。@Chema它们的定义太大了,我认为它们无关紧要Flow
是一个抽象类,DataFrameFlow
继承它。我正试图提供更详细的代码,但这需要一些时间Hi@calvin,如果它们是case类,你可以进行模式匹配来构建你的对象。Hi-Dmytro,我想你的观点是我不能在编译时这样做,但是,如果只是在运行时这样做会怎么样?我知道有一些反射策略可以让我得到声明的构造函数,但是它并不能完全解决我的问题,因为我仍然需要一些在运行时可以对类型进行“操作”的东西,例如,类型A
是从类型/type参数/traitB
派生的,或者是A
完全等于类型B
。我知道有一些东西,比如typeOf
/getClass
/ClassTag
,我最终可以从中获得,但我在这里真的迷路了,我想知道是否有一个包或somethin@calvinClassTag
/TypeTag
用于保存运行时的编译时信息。“但是,如果只是在运行时执行该操作会怎么样?”好的,但您必须在编译时返回一些类型。所以/*1*/
将只是流
(不是特定的子类型)。可以吗?是的,这个函数现在可以返回任何东西,甚至像com.xxx.xxx.DataFrameFlow
这样的字符串,我可以用java.lang.Class.getDeclaredConstructor
进行实例化,用一些java.lang.reflect.Method
进行调用,并与其他方法进行类型比较。然而,这些方法是混乱的,有时他们需要额外的操作,例如处理同伴对象,所以我想知道这里是否有一些简单的解决方案,也许C++中的一些函数如<代码> <代码>?@加尔文我重读你的问题,也许我误解了它。您不希望judgeFlow
返回具有特定子类型的Flow
实例,而是希望它返回有关实例的一些类型/类信息。您应该添加一些使用judgeFlow
,createFlow
的示例(如您所想象的)。输入和期望输出。当前的行为,它有什么问题,以及您希望如何修复它。(是的,类型信息可以是字符串或标签。)加尔文,我对C++中的类型特征不太熟悉。要么您有足够的信息在编译时进行操作,然后可以使用宏、无形状、编译时反射、隐式/类型类等进行操作,要么您只有在运行时才有必要的信息(这种情况似乎是从运行时字符串路径开始的,或者它是编译时字符串文本?)然后您必须使用运行时反射(Java反射:类
,方法
等,或者Scala反射:符号
,类型
,镜像
等)。如果你想要更好的答案。。。