Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中是否有某种方法可以返回类型?_Scala_Reflection_Types_Pattern Matching_Scala Reflect - Fatal编程技术网

在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参数/trait
    B
    派生的,或者是
    A
    完全等于类型
    B
    。我知道有一些东西,比如
    typeOf
    /
    getClass
    /
    ClassTag
    ,我最终可以从中获得,但我在这里真的迷路了,我想知道是否有一个包或somethin@calvin
    ClassTag
    /
    TypeTag
    用于保存运行时的编译时信息。“但是,如果只是在运行时执行该操作会怎么样?”好的,但您必须在编译时返回一些类型。所以
    /*1*/
    将只是
    (不是特定的子类型)。可以吗?是的,这个函数现在可以返回任何东西,甚至像
    com.xxx.xxx.DataFrameFlow
    这样的字符串,我可以用
    java.lang.Class.getDeclaredConstructor
    进行实例化,用一些
    java.lang.reflect.Method
    进行调用,并与其他方法进行类型比较。然而,这些方法是混乱的,有时他们需要额外的操作,例如处理同伴对象,所以我想知道这里是否有一些简单的解决方案,也许C++中的一些函数如<代码> <代码>?@加尔文我重读你的问题,也许我误解了它。您不希望
    judgeFlow
    返回具有特定子类型的
    Flow
    实例,而是希望它返回有关实例的一些类型/类信息。您应该添加一些使用
    judgeFlow
    createFlow
    的示例(如您所想象的)。输入和期望输出。当前的行为,它有什么问题,以及您希望如何修复它。(是的,类型信息可以是字符串或标签。)加尔文,我对C++中的类型特征不太熟悉。要么您有足够的信息在编译时进行操作,然后可以使用宏、无形状、编译时反射、隐式/类型类等进行操作,要么您只有在运行时才有必要的信息(这种情况似乎是从运行时字符串
    路径开始的,或者它是编译时字符串文本?)然后您必须使用运行时反射(Java反射:
    方法
    等,或者Scala反射:
    符号
    类型
    镜像
    等)。如果你想要更好的答案。。。