gpt4 book ai didi

Java 泛型 - 无界通配符允许混合不同类型(无警告)

转载 作者:行者123 更新时间:2023-12-04 06:18:15 24 4
gpt4 key购买 nike

考虑以下简单代码:

List <?> list4[] = { Arrays.asList("1","2"), Arrays.asList(1,2)};

我确实明白无界通配符是一种可具体化的类型;因此我明白为什么上述工作没有任何问题(没有任何未经检查的警告)

但是如果你仔细看,上面的代码现在会产生问题。
List <string>的混合物和 List <Integer>在数组中。像上面这样的特殊情况不应该有未经检查的警告吗?
List  <String> x = list4[0];  
List <String> y = list4[1]; <-- problem right?

我知道这是一个荒谬的例子,但这只是一个在公共(public)容器中混合类型时出现问题的例子。

最佳答案

为什么会出现问题?

更明确一点:请提供一些引发 ClassCastException 的代码在没有类型转换来证明这是一个问题的情况下。当代码可以在运行时创建类型错误时,即使没有使用显式转换,也会提供类型安全警告。

为了使提议的分配编译,必须添加一个类型转换:

List<String> x = (List<String>) list4[0];

但是,转换为参数化类型会产生类型安全警告。因为 Java 的泛型类型没有被具体化,所以类型检查的必要信息在运行时将不可用。警告让你知道,如果你执行这样的 Actor ,你可能有 ClassCastException在代码中没有显式强制转换的地方。例如:
List<String> y = (List<String>) list4[1]; /* Ignore the warning... */
...
...
String s = y.get(0); /* Throws ClassCastException, even though there's
no (explicit) cast at this location! */

使用这种数组的正确方法是分配给无界类型:
List<?> y = list4[1];
Object z = y.get(0);

关于Java 泛型 - 无界通配符允许混合不同类型(无警告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6962478/

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