Java泛型中<? super T>和<? extends T>的区别
各位同行好!我开始学习Java泛型,遇到了通配符(wildcards)。我读过文档也看过视频,但至今仍对` super T>`和` extends T>`这两个结构感到困惑。
我理解`? extends T`表示“某个是T的子类型的类型”,而`? super T`表示“某个是T的超类型的类型”。但在实践中,我总是遇到编译错误。
例如,我有这样一个使用List的代码:
```java
public class Test {
public static void addNumbers(List super Integer> list) {
list.add(42); // 这能工作
}
public static void readNumbers(List extends Integer> list) {
Integer num = list.get(0); // 这能工作
list.add(42); // 编译错误!为什么?
}
}
```
为什么我不能向`List extends Integer>`添加元素,尽管可以从中读取?反过来——为什么我可以向`List super Integer>`添加元素,但从中读取时只能得到Object?