为什么scala处理java接口中的默认方法与java本身不同?

时间:2017-02-21 14:05:43

标签: scala scala-java-interop

采用以下类和接口:

public class A {
    public int foo() {
        return 1;
    }
}

public interface B {
    default int foo() {
        return 2;
    }
}

如果你在java中定义一个子类

public class C extends A implements B {
}

在C实例上调用foo将返回1,因为java更喜欢接口上的超类。

在scala中执行相同的操作会产生编译错误:

class D extends A with B

Error:(3, 9) class D inherits conflicting members:
  method foo in class A of type ()Int  and
  method foo in trait B of type ()Int
(Note: this can be resolved by declaring an override in class D.)

手动覆盖方法

class D extends A with B {
  override def foo(): Int = super.foo()
}

仍然提供不正确的行为,在D的实例上调用foo将返回2.

要使scala类的行为与java相同,在这种情况下,您手动覆盖每个方法,并在每次调用中将A指定为超类。

class D extends A with B {
  override def foo(): Int = super[A].foo()
}

为什么这样实施?是否有合理的方法来解决它,而不是在那种情况下手动覆盖每种方法?

0 个答案:

没有答案