【问题标题】:Significance of inheriting method from superclass instead of default method from implementing interface in java 8从超类继承方法而不是从java 8中实现接口的默认方法的意义
【发布时间】:2019-01-02 08:35:32
【问题描述】:

我在阅读here 中有关 java 8 默认方法时遇到以下段落:

如果层次结构中的任何类具有具有相同签名的方法,则默认方法变得无关紧要。默认方法不能覆盖 java.lang.Object 中的方法。道理很简单,因为 Object 是所有 java 类的基类。因此,即使我们在接口中将 Object 类方法定义为默认方法,它也将毫无用处,因为将始终使用 Object 类方法。这就是为什么为了避免混淆,我们不能使用覆盖 Object 类方法的默认方法。

我很快尝试了以下代码来确认行为

public class DefaultMethodClass {
    public void defaultMethod() 
    {
        System.out.println("DefaultMethodClass.defaultMethod()");
    }
}

public interface DefaultMethodInterface {
    public default void defaultMethod() 
    {
        System.out.println("DefaultMethodInterface.defaultMethod()");
    }
}

public class DefaultMethodClassInterfaceChild extends DefaultMethodClass implements DefaultMethodInterface  
{
    public static void main(String[] args) {
        (new DefaultMethodClassInterfaceChild()).defaultMethod();
    }
}

这会打印出来

DefaultMethodClass.defaultMethod()

我看不出语言设计者选择这种特定行为的任何具体原因。他们有什么重要的理由让我失踪吗?还是只是接口默认方法在逻辑上的重要性低于超类提供的具体实现?

【问题讨论】:

标签: java java-8 default-method


【解决方案1】:

我看不出语言设计者选择这种特定行为的任何具体原因。

方法定义在 Java 1.0 中,接口默认方法在 Java 8 中添加。为 Java 1.0 编写的代码仍然需要工作。

或者它只是接口默认方法在逻辑上比超类提供的具体实现更重要?

实际上,在编写现有代码 20 多年后添加它们的重要性较低。

【讨论】:

  • 即使没有向后兼容 Java 8 之前的代码,当 default 方法被添加到接口时,允许 default 方法覆盖现有方法可能会导致现有代码出现令人惊讶的行为。
【解决方案2】:

答案很简单:你可以实现多个interface,但你可以只扩展一个class。实际上,通过实现多个接口,您不能拥有多个同名的 default 方法。

如果在任何情况下,default 方法的优先级高于在层次结构中的真实类中实现的方法,那么您最终会遇到 Java 设计人员不希望多重继承的完全相同的问题:歧义。

个人观点:默认方法被视为“未定义功能时的实现”,如果该方法是在真实类中定义的,则应该是更具体的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2023-01-23
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多