【问题标题】:scala - yet another type mismatchscala - 另一种类型不匹配
【发布时间】:2015-12-21 07:05:13
【问题描述】:

类型不匹配; found : IDataContext[_$1] where type _$1 <: dbobject required: idatacontext a>

这个有问题的部分“required: IDataContext[DBObject]”其实是这样定义的。

abstract class IDataContextBuilder[+A <: DBObject] {

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

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

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 <: dbobject idatacontext unit>

Dim1Agg 是 DBObject 的子类型

【问题讨论】:

    标签: scala


    【解决方案1】:

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

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

    编辑:

    trait DBObject
    trait Dim1Agg extends DBObject
    trait IDataContext[A]
    
    abstract class IDataContextBuilder[+A <: DBObject] {
      def initXDataPoints[B>:A](dataContext: IDataContext[B]): Unit
    }
    
    class Dim1DataContextBuilder extends IDataContextBuilder[Dim1Agg] {
      override def initXDataPoints[B >: Dim1Agg](dataContext: IDataContext[B]): Unit = ???
    }
    

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

    【讨论】:

    • 我认为这是一个正确的解决方案,但是当我使用 [A <: dbobject op>
    • 我想你想用子类 Dim1Agg 参数化类 Dim1DataContextBuilder。然后覆盖 initXDataPoints 将很简单。像这样的:
    • 好的,它可以工作。但我仍然不明白为什么我的方法def initXDataPoints[A &lt;: DBObject](dataContext: IDataContext[A]): Unit 版本不再给出关于逆变位置的编译错误。
    • 我认为这是因为方法的类型参数 A 隐藏了类的类型参数 A。因此,该方法的类型 A 实际上就像使用另一种类型,称为 B。并且 B 不受任何方差限制。
    猜你喜欢
    • 2013-12-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多