2015-11-18 60 views
1

所以,我有以下用例。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

問題是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] = ??? 
} 
+0

在類屬參數中不使類爲非協變類的原因是什麼?謝謝 - 這個語法就像一個魅力:) –

+0

原因是'Class'是一個不支持協方差的Java類。 –

+0

@TillRohrmann這不適用於'ClassTag'和'TypeTag',但它們仍然不變。 –