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

Clarification on why I cannot override a method using a generic class parameter by a subtype of it

鉴于以下情况 (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 = ???
}

我脑子里还不清楚,为什么 ContaineEarth 无法覆盖。

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

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

  def dummy(container: C): Any
}

我得知游戏中存在差异,并阻止它。

但对我来说,方差大约是 Container[Dirt]Container[Earth] 的子类型 if Container 泛型参数协变时,Dirt 扩展 Earth

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

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

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

container
class AnotherContainerEarth extends Container[Earth]

new DirtDummy().dummy(new AnotherContainerEarth)

所以这会违反合同。

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