类型变量不相关的默认继承错误:为什么?
问题内容:
免责声明 :这是 不是 这个情况(而错误的声音是一样的):)从类型为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<T extends I1&I2> {
List<T> 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: 顺便说一句,我在JLS中没有发现对此案例有任何明显的限制。最好通过引用JLS来确认您的答案。
UPD-3: 一些用户告诉我们此代码在Eclipse中已很好地编译。我无法检查它,但是我检查javac
并得到了此错误:
error: class INT#1 inherits unrelated defaults for x() from types I1 and I2
class A<T extends I1&I2> {
^
where INT#1 is an intersection type:
INT#1 extends Object,I1,I2
1 error
问题答案:
这只是一个错误。事实证明,该错误始于规范,然后扩散到实现中。规范错误在这里:https
:
//bugs.openjdk.java.net/browse/JDK-7120669
该约束是完全有效的;显然可能存在同时扩展I1和I2的类型T。问题在于我们如何验证此类类型的格式正确性。