当前位置: 首页 > 面试题库 >

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

慕宪
2023-03-14
问题内容

免责声明 :这是 不是 这个情况(而错误的声音是一样的):)从类型为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。问题在于我们如何验证此类类型的格式正确性。



 类似资料:
  • This tells smarty what resource type to use implicitly. The default value is 'file', meaning that $smarty->display('index.tpl'); and $smarty->display('file:index.tpl'); are identical in meaning. See t

  • 我是Apache Beam的新手,并尝试使用DirectRunner和DataflowRunner运行示例读写程序。在我的用例中,CLI参数很少,为了实现这一点,我创建了一个扩展PipelineOptions的接口“CustomOptions.java”。 使用DirectRunner,程序运行良好,但使用DataflowRunner,它说“接口CustomOptions缺少一个名为‘项目’的属性

  • 本文向大家介绍浅谈python中的变量默认是什么类型,包括了浅谈python中的变量默认是什么类型的使用技巧和注意事项,需要的朋友参考一下 1、type(变量名),输出的结果就是变量的类型; 例如 >>> type(6) <type 'int'> 2、在Python里面变量在声明时,不需要指定变量的类型,变量的类型是动态指定的;>>> x=5 >>> type(x) <type 'int'> >>

  • 问题内容: 我正在用Java 构建一个类。逻辑本身可以工作并找到期望的解决方案(带有任意数量的参数)。无论如何,部分项目如我所料。 问题来自解决方案表示的问题。可以公平地说,我已经用Python完成了这个项目,并决定尝试使用Java作为一种介绍,这可能是问题所在,我也想像Python一样这样做。 这是我的一些课程: 问题是它仍然从Operation类获取令牌:“ null” 我知道这可能是因为op

  • 我在抽象课上有以下内容... 还有另一个类,它继承了这个类... 当我从主类执行以下调用时,我收到一个错误... 我的问题是..为什么会发生这种情况?我的getEntityById不是返回T型的东西,在这种情况下应该是产品吗? 我在 Netbeans 中工作,编译时未显示任何错误。 感谢您的帮助=)

  • 问题内容: 假设有以下几种类型: 在这种情况下,如果执行,将打印“ hi from foo”。为什么的实现优先?不继承自,因为如果只实现,则将调用实现?因此,仍然不编译代码是有意义的。另外,由于应该具有的实现,为什么我不能像这样重写它: 尝试这样做时会发生以下错误: 错误的类型限定符Bar在默认的超级调用方法中,sayHi()在Foo中被覆盖 问题答案: 在JLS 9.4.1中 几乎使用您的确切示