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],
^
我無法弄清楚如何得到這個加工。
在類屬參數中不使類爲非協變類的原因是什麼?謝謝 - 這個語法就像一個魅力:) –
原因是'Class'是一個不支持協方差的Java類。 –
@TillRohrmann這不適用於'ClassTag'和'TypeTag',但它們仍然不變。 –