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



考虑以下简单代码:

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

我理解unbounded wildcard是一个可验证的类型;因此,我确实理解为什么上面的工作没有任何问题(没有任何未检查的警告)

然而,如果你仔细看,上面的代码现在会产生一个问题。
阵列中有List <string>List <Integer>的混合物。像上面这样的特殊情况不应该有一个未检查的警告吗?

List  <String> x = list4[0];  
List  <String> y = list4[1]; <-- problem right?  

我知道这是一个荒谬的例子,但它只是一个例子,问题出现的地方,有混合类型在一个共同的容器

为什么这是个问题?

更有针对性:请提供一些在没有强制转换的情况下引发ClassCastException的代码,以演示它是如何出现问题的。当代码在运行时创建类型错误时,即使没有使用显式强制类型转换,也会提供类型安全警告。


为了使所建议的赋值可以编译,必须添加强制转换:

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

但是,强制转换为参数化类型将产生类型安全警告。因为Java的泛型类型没有被具体化,所以类型检查的必要信息在运行时将不可用。该警告让您知道,如果执行这样的强制转换,可能会在代码中没有显式强制转换的地方出现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);

最新更新