所以,我有以下用例。
有一个名为SinglePredictionTester的类,具有以下实现。
class SinglePredictorTester[T <: Class[SurvivalPredictor]](predictorClass: T,
dataSplitter: DataSplitter,
titanic: DataFrame) extends PredictionTester {
import titanic.sqlContext.implicits._
override def test: Map[SurvivalPredictor, Double] = ???
}
这个类的想法是采用SurvivalPredictor类的子类,在其中实例化它并执行一些方法来测试它的准确性。
SurvivalPredictor有很多实现。
我打算像这样调用SinglePredictionTester:
val test: Map[SurvivalPredictor, Double] = new SinglePredictorTester(classOf[SexBasedPredictor],
new DataSplitter {},
new DataFrameLoader {}.load(getPathForResource("train.csv"),
sqlContext)).test
然而,这不会编译并给我以下错误:
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],
^
我无法弄清楚如何让这个工作。
答案 0 :(得分:1)
问题是Class
在其泛型类型参数中不是协变的。但是,您可以通过指定T <: SurvivalPredictor
。
class SinglePredictorTester[T <: SurvivalPredictor](
predictorClass: Class[T],
dataSplitter: DataSplitter,
titanic: DataFrame) extends PredictionTester {
import titanic.sqlContext.implicits._
override def test: Map[SurvivalPredictor, Double] = ???
}