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

时间:2011-08-05 20:50:09

标签: java generics

考虑以下简单代码:

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?  

我知道这是一个荒谬的例子,但它只是一个例子,在公共容器中存在混合类型的情况下出现问题。

1 个答案:

答案 0 :(得分:3)

为什么会出问题?

更具针对性:请提供一些代码,在没有强制转换的情况下引发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);