斯卡拉 - 另一种类型不匹配

时间:2015-09-23 19:59:49

标签: scala

类型不匹配; found:IDataContext [_ $ 1]其中type _ $ 1<:DBObject required:IDataContext [DBObject]注意:_ $ 1<:DBObject,但类IDataContext在类型A中是不变的。您可能希望将A定义为+ A. (SLS 4.5)

这个有问题的部分需要:IDataContext [DBObject]"实际上是这样定义的。

abstract class IDataContextBuilder[+A <: DBObject] {

  def initXDataPoints(dataContext: IDataContext[A]): Unit
}

我把它改成了以下它可以工作,但看起来很冗余

abstract class IDataContextBuilder[+A <: DBObject] {

  def initXDataPoints[A <: DBObject](dataContext: IDataContext[A]): Unit
}

现在问题在于实现上述方法:

override def initXDataPoints[Dim1Agg](dataContext: IDataContext[Dim1Agg]): Unit = { ...}

方法initXDataPoints不会覆盖任何内容。注意:类Dim1DataContextBuilder的超类包含以下非最终成员名为initXDataPoints:def initXDataPoints [A&lt;:DBObject](dataContext:IDataContext [A]):Unit

Dim1Agg是DBObject的子类型

1 个答案:

答案 0 :(得分:1)

查看第一个代码段我认为你有一个方差问题:类型参数A是协变的(用+定义)但是它出现在反变量位置 - 参数{{ 1}}到方法dataContext。 您可以做的是参数化initXDataPoints,其下限为:

initXDataPoints

编辑:

def initXDataPoints[B >: A](dataContext: IDataContext[B]): Unit

添加下限类型参数B的基本原理是实现将无法使用类型A的任何特定属性。使用A的特定属性可能会在继承下中断,因此scala编译器不允许这样做。这在“Scala编程”第2章第19章(类型参数化)一书中得到了很好的解释。我建议阅读整章,并寻找在第19.4节中解释这一点的具体例子。