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

时间:2015-11-18 17:31:36

标签: scala

所以,我有以下用例。

有一个名为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],
                                             ^

我无法弄清楚如何让这个工作。

1 个答案:

答案 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] = ???
}