java - 类型变量的不相关默认继承错误 : why?

标签 java java-8 type-variables

免责声明:这不是关于此案例的不是(虽然错误听起来相同):class inherits unrelated defaults for spliterator() from types java.util.Set and java.util.List

原因如下:

考虑两个接口(interface)(在包“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 从类型 a.I1 和 a.I2 继承不相关的 x() 默认值

为什么我不能定义这样的类型变量?为什么 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。问题是我们如何验证这些类型的良构性。

关于java - 类型变量的不相关默认继承错误 : why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644237/

相关文章:

haskell - ScopedTypeVariables 不会将类型变量带入作用域

Eclipse 无法识别 Java 项目;类路径问题

java - 超立方体边界框问题

java - 用java 8重写列表的收集列表(创建集群)

java - 检查流中的 instanceof

java - 通用类创建

java - 从 Dropwizard 应用程序日志中删除 hibernate 日志记录

java - 调用 DropBox getAccountInfo() 时出现断言错误

Java 8 将 Map<Integer, List<String>> 转换为 Map<String, List<Integer>>

haskell - 有没有一种简单的方法来引用具有约束参数的类型?