从接口中的默认方法中访问super方法

时间:2014-03-25 11:00:55

标签: java interface java-8

我正在摆弄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的类,那么我实际上UnrelatedInterfaceOneUnrelatedInterfaceTwo的实现,所以它可以工作吗?

为什么在这种情况下会出现这种特定的编译器错误?

2 个答案:

答案 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