Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 - Fatal编程技术网

Scala-传递派生类型的类以代替超类型的类

Scala-传递派生类型的类以代替超类型的类,scala,Scala,因此,我有以下用例 有一个名为SinglePredictionTester的类,具有以下实现 class SinglePredictorTester[T <: Class[SurvivalPredictor]](predictorClass: T, dataSplitter: DataSplitter,

因此,我有以下用例

有一个名为SinglePredictionTester的类,具有以下实现

class SinglePredictorTester[T <: Class[SurvivalPredictor]](predictorClass: T,
                                                            dataSplitter: DataSplitter,
                                                            titanic: DataFrame) extends PredictionTester {

  import titanic.sqlContext.implicits._

  override def test: Map[SurvivalPredictor, Double] = ???

}
但是,这不会编译,并给我以下错误:

Error:(13, 46) inferred type arguments [Class[com.dhruvk.kaggle.predictors.implementations.SexBasedPredictor]] do not conform to class SinglePredictorTester's type parameter bounds [T <: Class[com.dhruvk.kaggle.predictors.SurvivalPredictor]]
  val test: Map[SurvivalPredictor, Double] = new SinglePredictorTester(classOf[SexBasedPredictor],
                                             ^

错误:(13,46)推断的类型参数[Class[com.dhruvk.kaggle.predictors.implementations.SexBasedPredictor]]不符合类SinglePredictorTester的类型参数界限[T问题在于,
Class
在其泛型类型参数中是不协变的。但是,您可以通过指定
T来解决这个问题。在其泛型类型参数中不使类成为非协变的原因是什么?是的,谢谢-这个语法很有魅力:)原因是
Class
是一个Java类,它不支持协变。@TillRohrman这不适用于
ClassTag
TypeTag
,但它们仍然是不变的。@DhruvKapur除了@TillRohrman给出的原因之外,因为它不应该是。例如,只有一个
类[对象]
类[对象]
。如果
Class
是协变的,那么会有很多。因此,如果你有
Class[Object]
类型的东西,你就不知道这实际上是什么类。你也不能有效地编写类似
Class[t>:String]
的东西。
Error:(13, 46) inferred type arguments [Class[com.dhruvk.kaggle.predictors.implementations.SexBasedPredictor]] do not conform to class SinglePredictorTester's type parameter bounds [T <: Class[com.dhruvk.kaggle.predictors.SurvivalPredictor]]
  val test: Map[SurvivalPredictor, Double] = new SinglePredictorTester(classOf[SexBasedPredictor],
                                             ^