java 8中的默认方法

时间:2014-02-21 07:28:15

标签: java oracle java-8

问题2:以下界面有什么问题?

public interface SomethingIsWrong {
    void aMethod(int aValue) {
        System.out.println("Hi Mom");
    }
}

答案2:它有一个方法实现。只有默认和静态方法有实现(我认为这是错误的,因为界面不能有身体的方法,因为默认它的方法是抽象的)。

问题3:修复问题2中的界面。

回答3:

public interface SomethingIsWrong {
    void aMethod(int aValue);
}

或者,您可以将aMethod定义为默认方法:

public interface SomethingIsWrong {
    default void aMethod(int aValue) {
        System.out.println("Hi Mom");
    }
}

我在docs.oracle.com上发现了这个,我想知道这些是ORACLE提供的正确答案吗? 在我看来。

1.在答案2中,写道只有默认和静态方法有实现吗?

2.在回答3的替代方案中,给出了aMethod可以定义为默认方法但是 接口不能有不良的主体,因为默认接口中的方法是抽象的,我们只能在它的子类中实现它的方法。

请让我知道ORACLE网站是对还是错?

2 个答案:

答案 0 :(得分:11)

您正在查看的页面讨论即将发布的Java 8,其中接口可以包含包含实现的“默认”方法,也可以使用静态方法。

在Java 8之前,接口方法实际上不能有一个主体,接口也不能有静态方法。

答案 1 :(得分:2)

默认方法将在java 8中引入,也称为后卫方法

关于默认方法的一个重要方面,如果类实现了两个接口并且这两个接口都定义了具有相同签名的默认方法,那么可能会导致多重继承中出现菱形问题?

public interface Foo {
    default void fun(){
       System.out.println("Calling Foo.fun()");
    }
}

public interface Bar {
    default void fun(){
       System.out.println("Calling Bar.fun()");
    }
}


public class FooBar implements Foo, Bar {
}

在这种情况下,它会产生编译错误 -

java: class FooBar inherits unrelated defaults for fun() from types Foo and Bar

在这种情况下,类FooBar将被强制覆盖冲突的方法fun。所以正确的实现将是

public class FooBar implements Foo, Bar {
    public void fun(){...}
}