作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
采用以下代码:
public class Main {
public static void main(String[] args) {
List<Object> list1 = new ArrayList<Object>();
List<? super Integer> list2 = list1;
list2.add(1);
list1.add("two");
//list2.add("three"); // will never compile!!.
System.out.println("list1: " + list1.toString());
System.out.println("list2: " + list2.toString());
}
}
这是输出:
list1: [1, two]
list2: [1, two]
一方面,list2 不允许对像字符串“three”这样的对象使用 add() 方法;但另一方面,它引用了一个包含对象的列表。
最佳答案
编译器不关心列表实例 接受什么类型的对象。在字节码级别,由于类型删除,任何引用都被接受。它只知道两个具有 List
类型的变量,这些变量使用特定的通用类型进行参数化。这些变量中的一个可以分配给另一个是经过检查然后被遗忘的东西。
因此,当您尝试添加 “three”
时,它会查看 list2
类型接受的泛型类型,发现它不匹配,然后抛出编译错误。
程序方面:没有问题。如果您想限制要通过变量引用从列表中添加或删除的对象,则由您决定。
请注意,如果不进行强制转换,就不可能从变量引用的列表中检索到 String
。
关于java - 关于泛型对我来说奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157487/
我是一名优秀的程序员,十分优秀!