相关疑难解决方法(0)

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

原始列表转换为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;
}
Run Code Online (Sandbox Code Playgroud)

背景故事(缓解xy问题):

我正在使用的API返回List<JAXBElement>.我碰巧知道它总是如此List<JAXBElement<String>>.我计划循环并构建自己的List<String>,但我在写时试图修复(但不是抑制)原始类型编译器警告List<JAXBElement> raw = api();.

我试过了:

List<JAXBElement<?>> raw = api();
List<JAXBElement<?>> raw = (List<JAXBElement<?>>) api();
Run Code Online (Sandbox Code Playgroud)

但这些给出了类型不匹配错误.

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

for (JAXBElement<?> e : api()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

java generics casting raw-types unbounded-wildcard

25
推荐指数
1
解决办法
2561
查看次数

为什么List与List <?>兼容,但List <List>不在List <List <?>>中?

我正在使用非通用代码实现一些接口,我想在没有的情况下摆脱警告@SupressWarnings.但后来我遇到了这样的情况:

public abstract class A {

    public abstract List m1();

    public abstract List<List> m2();

}

public class B extends A {

    @Override
    public List<?> m1() { // the compiler is happy with this
        // whatever
    }

    @Override
    public List<List<?>> m2() { // but not with this
        // whatever
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么?为什么我List可以List<?>在重写方法时更改返回类型,并且不能将相同的逻辑List<List>应用于List<List<?>>

这是编译器给我的消息:

返回类型java.util.List<java.util.List<?>>不兼容java.util.List<java.util.List>

但为什么List兼容List<?>并且List<List>不兼容List<List<?>>

我做了几个演示:

java generics type-safety

5
推荐指数
0
解决办法
78
查看次数