Java Generics - 类本身的子类?

标签 java list generics collections wildcard

我目前正在阅读 Java Generics,当涉及到通配符时我有点卡住了。

我从 Collections 类中得到了这个方法:

public void <T> copy(List<? super T> dest, List<? extends T> src) {
    for(int i = 0; i < src.size(); i++) {
        dest.set(i, src.get(i));
     }
}

然后我被告知可以像这样调用方法:

List<Object> objs = new ArrayList<Object>();
List<Integer> ints = new ArrayList<Integer>();
Collections.copy(objs, ints);

由于类型参数已经交由编译器决定,书上说编译器选择类型参数为Integer。

但这怎么可能呢?

如果取为Integer,这意味着在方法声明中-
List<? extends T>将转换为 List<Integer extends Integer> .

这是一个错误,还是关于泛型有不同的规则?我四处搜索,大多数结果都说一个类不能是其自身的子类。

最佳答案

不,这不是错误。

? extends Integer 表示:任何是或扩展 Integer 的类(或实现 Integer,如果 Integer 是一个接口(interface))。

也一样吗? super Integer,这意味着:任何 Integer 类或者是 Integer 的父类(super class)或超接口(interface)。

关于Java Generics - 类本身的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441733/

相关文章:

c# - 为什么接口(interface)列表不能使用实现类型?

python - 如何从列表中删除某些内容以及字符串匹配?

行名作为数据框列表中的列

Python - 初始化多个列表/行

java - 是否可以从 Java 中的对象构造函数中删除泛型类型参数?

scala - 无法在列表中获取通用对象的类型

java - 在 ArrayList 中创建唯一项的 ArrayList

java - 如何使用 jpackage (Java 19) 创建启动器作为 Windows 服务

java - 将 java hashmap 转换为 scala map

java - 在类与方法上定义@Transactional有什么区别