gpt4 book ai didi

java - 关于泛型对我来说奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 08:13:02 24 4
gpt4 key购买 nike

采用以下代码:

 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com