Scala - 为什么无法覆盖超类的方法

时间:2014-10-21 11:44:43

标签: scala

  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)]

1 个答案:

答案 0 :(得分:5)

原因很简单:JVM不允许基于参数类型的逆变而进行覆盖。它只允许基于返回类型协方差的覆盖。

请查看here,了解其对Scala的影响。

来自Wikipedia

  

类似地,允许覆盖方法接受比基类中的方法更通用的参数是类型安全的:

     

例如:

class AnimalShelter {
    void putAnimal(Animal animal) {
        ...
    }
}

class CatShelter extends AnimalShelter {
    void putAnimal(Object animal) {
        ...
    }
}
     

实际上没有多少面向对象的语言允许这样做 - C ++和Java [以及Scala]会将此解释为具有重载名称的无关方法