类型变量的无关默认值继承错误:为什么?

And*_*niy 22 java type-variables java-8

免责声明:这不是关于这种情况(虽然错误听起来一样):class从类型java.util.Set和java.util.List继承spliterator()的无关默认值

这就是为什么:

考虑两个接口(在包" a"中)

interface I1 {
    default void x() {}
}

interface I2 {
    default void x() {}
}
Run Code Online (Sandbox Code Playgroud)

我绝对清楚为什么我们不能宣布这样的类:

abstract class Bad12 implements I1, I2 {
}
Run Code Online (Sandbox Code Playgroud)

(!)但我无法理解这种限制,参考类型变量:

class A<T extends I1&I2> {
    List<T> makeList() {
        return new ArrayList<>();
    }
}
Run Code Online (Sandbox Code Playgroud)

有错误: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() { };
}
Run Code Online (Sandbox Code Playgroud)

乃至

abstract class A0 implements I1, I2 {
    @Override
    public abstract void x();
}
Run Code Online (Sandbox Code Playgroud)

等等.为什么我不能为这类类声明特殊类型的变量?

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<T extends I1&I2> {
        ^
  where INT#1 is an intersection type:
    INT#1 extends Object,I1,I2
1 error
Run Code Online (Sandbox Code Playgroud)

Bri*_*etz 8

这只是一个错误.事实证明,bug在规范中开始,然后溢出到实现中.规范错误在这里:https: //bugs.openjdk.java.net/browse/JDK-7120669

约束完全有效; 显然存在类型T延伸I1和I2.问题是我们如何验证这些类型的良好结构.