澄清为什么我不能通过它的子类型使用泛型类参数覆盖方法

Neo*_*eok 3 oop inheritance overriding scala

鉴于以下情况(scastie

trait Element
class Earth extends Element

trait Container[T]
class ContainerEarth extends Container[Earth]

trait Dummy[E <: Element] {

  def dummy(container: Container[E]): Any
}

class EarthDummy extends Dummy[Earth] {

  def dummy(container: ContainerEarth): Any = ??? // could not override
  override def dummy(container: Container[Earth]): Any = ???
}
Run Code Online (Sandbox Code Playgroud)

我的脑子里仍然不清楚,为什么 ContaineEarth 不能覆盖。

我有一个解决业务问题的解决方案,但我需要了解为什么编译器拒绝替换。

trait Dummy[E <: Element, C <: Container[E]] {

  def dummy(container: C): Any
}
Run Code Online (Sandbox Code Playgroud)

我被告知游戏中存在差异,并防止它发生。

但对我来说,方差是关于Container[Dirt]Container[Earth]的子类型,如果DirtContainer通用参数是协变时扩展Earth

所以我愿意接受你的所有澄清。

Dmy*_*tin 5

TraitDummy[E <: Element]描述了一个契约。实现此特征的类必须具有dummy接受任意container: Container[E].

DirtDummy 是-a Dummy[Earth]。所以它的方法dummy必须接受任意的container: Container[Earth]。如果它只接受ContainerEarth它将无法处理container具有类型Container[Earth]但没有类型的ContainerEarth

class AnotherContainerEarth extends Container[Earth]

new DirtDummy().dummy(new AnotherContainerEarth)
Run Code Online (Sandbox Code Playgroud)

因此,这将违反合同。

当您定义时,def dummy(container: ContainerEarth): Any这不是覆盖而是重载。