我正在使用非通用代码实现一些接口,我想在没有@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
}
}
为什么呢?在重写方法时,为什么我可以将返回类型从List
更改为List<?>
,并且不能将List<List>
与List<List<?>>
应用相同的逻辑?
这是编译器给我的消息:
返回类型
不兼容java.util.List<java.util.List<?>>
与java.util.List<java.util.List>
但为什么List
与List<?>
兼容且List<List>
与List<List<?>>
无关?
我做了几个演示: