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