考虑以下简单代码:
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?
我知道这是一个荒谬的例子,但它只是一个例子,在公共容器中存在混合类型的情况下出现问题。
答案 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);