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]的子类型,如果Dirt在Container通用参数是协变时扩展Earth。
所以我愿意接受你的所有澄清。
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这不是覆盖而是重载。