采用以下类和接口:
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()
}
为什么这样实施?是否有合理的方法来解决它,而不是在那种情况下手动覆盖每种方法?