我正在摆弄Java 8并转到以下代码,我认为可以工作:
class UnrelatedClass implements UnrelatedInterfaceDefault {
@Override
public void unrelate2() {
System.out.println("Unrelated");
}
}
interface UnrelatedInterfaceDefault extends UnrelatedInterfaceOne, UnrelatedInterfaceTwo {
default public void unrelate() {
UnrelatedInterfaceOne.super.unrelate2();
UnrelatedInterfaceTwo.super.unrelate2();
}
}
interface UnrelatedInterfaceOne {
public void unrelate2();
}
interface UnrelatedInterfaceTwo {
public void unrelate2();
}
在UnrelatedInterfaceOne.super.unrelate()
,我收到错误:
abstract method unrelate2() in UnrelatedInterfaceOne cannot be accessed directly.
但是考虑一下我是否会创建一个实现UnrelatedInterfaceDefault
的类,那么我实际上做有UnrelatedInterfaceOne
和UnrelatedInterfaceTwo
的实现,所以它可以工作吗?
为什么在这种情况下会出现这种特定的编译器错误?
答案 0 :(得分:4)
这是失败的,因为接口中的方法是abstract
。如果你把它default
,那么我猜它会编译。我现在不能测试它。
来自JLS §15.12.3 - Compile-Time Step 3: Is the Chosen Method Appropriate?:
如果表单为
TypeName . super . [TypeArguments] Identifier
,则:
- 如果编译时声明为
abstract
,则为编译时错误。
另请注意,使用super
调用方法永远不会通过动态调度。它不会调用重写的方法,而只调用super
类中定义的方法,或者TypeName
。
答案 1 :(得分:0)
我试图让你的例子有用。
如前所述@Rohit Jain我需要更改abstract->默认。然后我在interface UnrelatedInterfaceDefault
中获得了diamond problem权限。我用空方法解决了它。
这就是全部,它有效。至于我,结果是合乎逻辑的)见下文
public class Main {
public static void main(String[] args) throws IOException, Exception {
UnrelatedClass uc = new UnrelatedClass();
uc.unrelate2();
uc.unrelate();
}
}
class UnrelatedClass implements UnrelatedInterfaceDefault {
@Override
public void unrelate2() {
System.out.println("Unrelated");
}
}
interface UnrelatedInterfaceDefault extends UnrelatedInterfaceOne, UnrelatedInterfaceTwo {
@Override
public default void unrelate2() {
}
default public void unrelate() {
UnrelatedInterfaceOne.super.unrelate2();
UnrelatedInterfaceTwo.super.unrelate2();
unrelate2();
}
}
interface UnrelatedInterfaceOne {
public default void unrelate2() {
System.out.println("relatedOne");
}
}
interface UnrelatedInterfaceTwo {
public default void unrelate2() {
System.out.println("relatedTwo");
}
}
输出:
Unrelated
relatedOne
relatedTwo
Unrelated