为什么带有通配符的Java通用代码无法编译?

拉屎

当我阅读这个我不明白的源代码示例时,我正在阅读Angelika Langer撰写出色的Java Generics FAQ。

import java.util.List;
import java.util.ArrayList;
import java.lang.Number;
import java.lang.String;
import java.lang.Long;

class X<T extends List<? extends Number>> {
    public void someMethod(T t) {
        t.add(new Long(0L));    // error
        Number n = t.remove(0);
    }
}

我不明白为什么编译器在类型擦除之前不能推断出“ Long extended Number”并将其与“?extended Number”匹配,从而使它<? extends Number>完全无用。

我已经阅读了常见问题解答,因此,我正在寻找更简单的解释以及替代方法。

提前致谢

他们是

假设有人以这种方式使用您的班级:

List<Double> list = new ArrayList<>();
X<List<Double>> x = new X<>();
x.someMethod(list);

现在,你的方法会尝试将添加LongList<Double>这就是编译器不允许的原因。

您不能将添加LongList<? extends Number>,因为List<? extends Number>可以将分配List<Double>List<Integer>,,等等。

您可以将类声明更改为X<T extends List<Number>>,这将解决编译错误,因为List<Number>您可以始终向中添加Long(或的任何其他子类的实例Number)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个通用的Java代码无法编译?

为什么在Java编译这个通用的代码?

为什么带有“ + +”的Java代码会编译?

当带有对象的相同代码起作用时,为什么带有对象的代码无法编译?

Java嵌套通配符通用将无法编译

为什么我的Java代码无法编译

为什么在Java 8中编译此通用代码?

为什么要编译此代码?(Java通用方法)

为什么以下带有循环泛型的代码无法编译?

Java为什么允许带有泛型的代码进行编译?

Java为什么允许带有泛型的代码进行编译?

为什么代码无法编译

为什么带有stringWithFormat的NSAssert无法编译?

为什么Java Type Erasure无法阻止此代码编译

为什么要编译具有这种通用界限的代码

为什么编译器无法识别Google Mock通配符?

为什么这段较少的代码无法编译?

代码意外地无法编译。为什么?

为什么此代码无法编译

为什么以下代码无法编译?

使用通配符调用通用方法无法编译

Java 8 Streams:为什么Collectors.toMap在带有通配符的泛型上表现不同?

为什么在Java数组中找到最大的通用方法无法编译?

Java泛型通配符:为什么不编译?

如果没有noexcept move构造函数,为什么带有std :: vector的代码不能编译却带有std :: unique_ptr的代码可以编译?

Java中的通用通配符。编译错误。

为什么要编译此Java代码?

为什么此Java代码成功编译

带有通配符的通用地图