给定的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()?
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] 删除。
我来说两句