原始列表可以转换为List<?>。为什么原始列表不能转换为List<?>列表
{ // works
List raw = null;
List<?> wild = raw;
}
{ // Type mismatch: cannot convert from List<List> to List<List<?>>
List<List> raw = null;
List<List<?>> wild = raw;
}背景故事(以减轻xy问题):
我使用的API返回List<JAXBElement>。我碰巧知道它总是List<JAXBElement<String>>。我计划循环并构建自己的List<String>,但是在编写List<JAXBElement> raw = api();时,我试图修复(但不是抑制)原始类型的编译器警告。
我试过:
List<JAXBElement<?>> raw = api();
List<JAXBElement<?>> raw = (List<JAXBElement<?>>) api();但这会导致类型错配错误。
有趣的是,这没有给出任何警告或错误:
for (JAXBElement<?> e : api()) {
// ...
}发布于 2014-11-05 20:52:18
不能直接分配或转换为,因为原始类型为List 不是一样的为List<?>。
当使用List时,类型检查将被忽略,您可以使用任何带有任何类型的泛型方法。当使用List<?>时,编译器不允许使用泛型参数的方法。
因此,您可以忽略以下警告:
@SuppressWarnings("rawtypes")和/或使用变通方法显式地转换它:
List<JAXBElement<String>> raw = (List<JAXBElement<String>>) ((Object)api());发布于 2014-11-05 20:50:20
如果只想删除警告,可以使用@SuppressWarnings(“rawtype”)。
基本上问题是编译器将the类型作为一个原始对象来处理,所以.“旧对象”不是“通用对象”,所以.你不能投他们。
从官方文档:http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html上读到
但是,如果将原始类型分配给参数化类型,则会收到警告: Box rawBox = rawBox ();// rawBox是Box intBox =rawBox的原始类型;//警告:未选中的转换如果使用原始类型调用相应泛型类型中定义的泛型方法,也会收到警告: Box stringBox =newBox<>();Box rawBox = stringBox;rawBox.set(8);//警告:未选中的调用设置(T)警告显示原始类型绕过泛型类型检查,将不安全代码的捕获推迟到运行时。因此,您应该避免使用原始类型。
https://stackoverflow.com/questions/26766704
复制相似问题