为什么当默认方法是通过子类的静态方法覆盖的Java 8编译失败?

克里斯蒂亚诺步骤:

给定的Java 8,为什么代码波纹管编译失败?

interface Father {
    static void method() { }
}

interface Mother {
    default void method() { }
}

interface Child extends Father, Mother {
    static void method() { }
}

按我的理解,每个静态方法属于其特定类别,因此,为什么当儿童接口定义static void method() { }编译器提供了以下错误?

()方法中的儿童与母亲重写方法()的方法擦出是静态的

不宜养孩子从母亲的默认方法实现,同时允许父亲与子女有自己的静态方法,如:Father.method()和Child.method()?

Pshemo:

Father是没有问题的,因为在这里从接口上的静态方法不能继承的(例如List.of(..)无法通过被调用ArrayList.of(..)),所以没有覆盖/隐藏这也意味着没有冲突。

正因为如此,我们可以放心地写

interface Father {
    static void method() { } 
}
interface Child extends Father {
    static void method() { } 
}

问题default void method() { }从方法Mother接口被继承到Child,这意味着后

interface Child extends Father, Mother { 
    static void method() { } 
}

你最终会与接口,将有两个method()版本:静态和非静态(默认)

interface Child extends Father, Mother { 
    static void method() { } 
    default void method() { } //inherited from Mother
}

但是,为什么是一个问题?

想象一下,你想其他方法添加到Child界面,将调用method()

interface Child extends Father, Mother { 
    static void method() { } 
    default void method() { } //inherited from Mother
    default void demo(){
        method(); //which code block should be executed?
    }
}

如果它执行从代码的静态方法()或默认()的方法?编译器将无法决定。

虽然这种情况可以通过使用来解决

  • Child.method() 对于静态方法,
  • this.method()默认方法(是的,这是wound't暧昧,因为静态方法不通过类的继承this是实例),

点是为了防止在第一时间这样的问题。这就是为什么我们需要不具有静态和聚集在一处相同的签名(名称+ parameterTypes)非静态方法(定义或继承)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java8:当引用的方法不是静态的时,为什么引用方法不能编译?

为什么通过实例调用静态方法不是Java编译器的错误?

java扩展静态方法,无法编译,为什么?

当我尝试覆盖静态方法时,为什么编译器没有抱怨?

当功能模板调用类模板的静态方法模板时,为什么编译失败?

编译测试库不编译接口的静态方法(Java 8)

为什么Maven编译失败?

Java 8默认方法覆盖(和Eclipse)

为什么这个编译?重写方法也不例外的子类

为什么在Sun JDK 6下可以编译隐藏的静态方法,但是在OpenJDK 6和7下会导致编译失败?

为什么在Maven中编译命令失败?

为什么此C ++程序编译失败?

Android资源编译失败为什么?

为什么使用EnTT过程编译失败

为什么JCF接口中的许多方法未在Java 8中设为默认方法?

快速覆盖静态方法编译错误

枚举,接口和(Java 8)lambda:代码可以编译,但在运行时会失败;这是预期的吗?

在Java 8中,为什么不能调用当前类正在实现的接口静态方法

为什么此Java 8方法参考进行编译?

为什么接口中没有静态方法,但是静态字段和内部类可以?[Java8之前的版本]

不覆盖接口默认实现时编译失败

为什么Java 8不允许使用非公共默认方法?

Java8:为什么禁止为java.lang.Object中的方法定义默认方法

为什么Java编译器允许通过null对象访问静态变量?

使用Kotlin在子类中强制执行静态方法编译?

Java用'extends'编译.java失败

Java 8流,为什么要编译第2部分...或者什么是方法参考,真的吗?

选择子类在编译时通过#define 实例化的最佳方法是什么

Maven编译失败,但没有Java错误