首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从List<List>转换为List<List<?>>

无法从List<List>转换为List<List<?>>
EN

Stack Overflow用户
提问于 2014-11-05 20:41:49
回答 2查看 4.4K关注 0票数 28

原始列表可以转换为List<?>。为什么原始列表不能转换为List<?>列表

代码语言:javascript
复制
{   // 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();时,我试图修复(但不是抑制)原始类型的编译器警告。

我试过:

代码语言:javascript
复制
List<JAXBElement<?>> raw = api();
List<JAXBElement<?>> raw = (List<JAXBElement<?>>) api();

但这会导致类型错配错误。

有趣的是,这没有给出任何警告或错误:

代码语言:javascript
复制
for (JAXBElement<?> e : api()) {
    // ...
}
EN

回答 2

Stack Overflow用户

发布于 2014-11-05 20:52:18

不能直接分配或转换为,因为原始类型为List 不是一样的List<?>

当使用List时,类型检查将被忽略,您可以使用任何带有任何类型的泛型方法。当使用List<?>时,编译器不允许使用泛型参数的方法

因此,您可以忽略以下警告:

代码语言:javascript
复制
@SuppressWarnings("rawtypes")

和/或使用变通方法显式地转换它:

代码语言:javascript
复制
List<JAXBElement<String>> raw = (List<JAXBElement<String>>) ((Object)api());
票数 3
EN

Stack Overflow用户

发布于 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)警告显示原始类型绕过泛型类型检查,将不安全代码的捕获推迟到运行时。因此,您应该避免使用原始类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26766704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档