gpt4 book ai didi

java - 为什么 Java 中允许使用未知泛型类型的数组?

转载 作者:行者123 更新时间:2023-11-30 11:27:10 25 4
gpt4 key购买 nike

在 Java 教程 ( http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html ) 中,我看到了以下内容:

// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;

// Run-time error: ClassCastException.
String s = lsa[1].get(0);
If arrays of parameterized type were allowed, the previous example
would compile without any unchecked warnings, and yet fail at run-time


// OK, array of unbounded wildcard type.
List<?>[] lsa = new List<?>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Correct.
oa[1] = li;
// Run time error, but cast is explicit.
String s = (String) lsa[1].get(0);

然后他们解释说,如果我们切换 List<String>[] lsa = new List<String>[10];List<?>[] lsa = new List<?>[10];那么没关系,但我们必须向上转换。

我的一位教授就此提出以下问题:“为什么后者可以编译?”

然后他给出了答案:“当参数是 ? 的意思是数组中的每个单元格都可以包含一个 ArrayList。因为没有关于泛型类类型的任何假设,所以之前的异常不会发生”

通配符有效而前一个无效对我来说仍然没有意义。如果我们必须在通配符示例中强制执行向上转型,为什么我们不能在第一个示例中也这样做?

如果有人能为我解决这个问题,我将不胜感激。

最佳答案

通配符会强制您施放,因此您需要了解真正的类别。

第一种情况(如果可能的话)会给你一种错误的安全感并且没有警告,因为泛型的全部意义在于让你无需不断地转换东西就可以工作。

关于java - 为什么 Java 中允许使用未知泛型类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19457376/

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