澄清为什么我不能通过它的子类型使用通用 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
时,这不是覆盖而是重载。
鉴于以下情况 (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
时,这不是覆盖而是重载。