and*_*enu 6 java generics compiler-errors wildcard
我大大简化了我的问题.这是它的读法.
我试图弄清楚为什么以下代码无法编译:
List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
l.add( new AnonType<AnonType<String>>() );
Run Code Online (Sandbox Code Playgroud)
哪里
public class AnonType<T> {
T a;
List<T> b;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误表示add不适用于给定的参数.OTOH,以下代码只有1级嵌套通配符完美编译:
List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );
Run Code Online (Sandbox Code Playgroud)
以下编译符合预期:
List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
list.add(new HashSet<Set<String>>());
list.add(new HashSet<Set<Integer>>());
Run Code Online (Sandbox Code Playgroud)
问题是泛型是类型不变的.
考虑一个更简单的例子:
Animal为Dog(例如Dog extends Animal)......
List<Animal> IS NOT一个List<Dog>List<? extends Animal>a到a 的捕获转换List<Dog>现在,这是在这种情况下发生的事情:
Set<?>为Set<String>...
Set<Set<?>> IS NOT一个Set<Set<String>>Set<? extends Set<?>>以Set<Set<String>>所以,如果你想List<T>在这里你可以添加Set<Set<String>>,Set<Set<Integer>>等等,那么T是不是 Set<Set<?>>,而是Set<? extends Set<?>>.
List<List<? extends Number>>List<Animal> animals = new ArrayList<Dog>()?<E extends Number>和之间有什么区别<Number>?| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |