class A
class B extends A
class D { def get: A = ??? }
class E extends D { override def get: B = ??? } // OK
class F { def set(b: B): Unit = ??? }
class G extends F { override def set(a: A): Unit = ??? } // Compile Error, override nothing
我的问题是为什么G不起作用,因为: (A =>单位)是(B =>单位)
的子类型implicitly[(A => Unit) <:< (B => Unit)]
答案 0 :(得分:5)
原因很简单:JVM不允许基于参数类型的逆变而进行覆盖。它只允许基于返回类型协方差的覆盖。
请查看here,了解其对Scala的影响。
来自Wikipedia:
类似地,允许覆盖方法接受比基类中的方法更通用的参数是类型安全的:
例如:
class AnimalShelter { void putAnimal(Animal animal) { ... } } class CatShelter extends AnimalShelter { void putAnimal(Object animal) { ... } }
实际上没有多少面向对象的语言允许这样做 - C ++和Java [以及Scala]会将此解释为具有重载名称的无关方法。