免责声明:这不是关于这种情况(虽然错误听起来一样):class从类型java.util.Set和java.util.List继承spliterator()的无关默认值
这就是为什么:
考虑两个接口(在包" a
"中)
interface I1 { default void x() {} } interface I2 { default void x() {} }
我绝对清楚为什么我们不能宣布这样的类:
abstract class Bad12 implements I1, I2 { }
(!)但我无法理解这种限制,参考类型变量:
class A{ List makeList() { return new ArrayList<>(); } }
有错误:class java.lang.Object&a.I1&a.I2 inherits unrelated defaults for x() from types a.I1 and a.I2
.
为什么我不能定义这样的类型变量?java
在这种情况下,为什么要关心不相关的默认值?什么类型的变量可以"打破"?
更新:只是为了澄清.我可以创建几个类的表单:
class A1 implements I1, I2 { public void x() { }; } class A2 implements I1, I2 { public void x() { }; }
乃至
abstract class A0 implements I1, I2 { @Override public abstract void x(); }
等等.为什么我不能为这类类声明特殊类型的变量?
UPD-2: BTW我在JLS中没有发现任何明显的限制.通过引用JLS确认您的答案会很高兴.
UPD-3:一些用户告诉我这个代码在Eclipse中编译得很好.我无法检查,但我查了一下javac
,得到了这个错误:
error: class INT#1 inherits unrelated defaults for x() from types I1 and I2 class A{ ^ where INT#1 is an intersection type: INT#1 extends Object,I1,I2 1 error
Brian Goetz.. 8
这只是一个错误.事实证明,bug在规范中开始,然后溢出到实现中.规范错误在这里:https: //bugs.openjdk.java.net/browse/JDK-7120669
约束完全有效; 显然存在类型T延伸I1和I2.问题是我们如何验证这些类型的良好结构.
这只是一个错误.事实证明,bug在规范中开始,然后溢出到实现中.规范错误在这里:https: //bugs.openjdk.java.net/browse/JDK-7120669
约束完全有效; 显然存在类型T延伸I1和I2.问题是我们如何验证这些类型的良好结构.