当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《类型变量的无关默认值继承错误:为什么?》经验,为你挑选了1个好方法。

免责声明:这不是关于这种情况(虽然错误听起来一样):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.问题是我们如何验证这些类型的良好结构.



1> Brian Goetz..:

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

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有