如果我有以下代码:
public class DummyClass<T> {
public List<T> getList() {
return new ArrayList<T>();
}
public Set<List<T>> getListSet() {
return new HashSet<List<T>>();
}
}
我有DummyClass<?> dummy
,
我能做到
List<?> list = dummy.getList();
没有任何错误。
然而,
Set<List<?>> listSet = dummy.getListSet();
给出了编译错误:
Type mismatch: cannot convert from Set<List<capture#1-of ?>> to Set<List<?>>
分配dummy.getListSet()
的行。
为什么我无法将dummy.getListSet()
分配给Set<List<?>>
?
答案 0 :(得分:1)
但是你可以这样做:
Set<? extends List<?>> listSet = listSet = dummyClass.getListSet();
请参阅优秀文章Generics gotchas。
答案 1 :(得分:-1)
首先要知道,编译器将?运算符替换为 Object 类。所以当你写这个:
DummyClass<?> dummy
你的班级定义如下:
public class DummyClass<Object>
和这样的方法:
public List<Object> getList() {
return new ArrayList<Object>();
}
public Set<List<Object>> getListSet() {
return new HashSet<List<Object>>();
}
你可以写
List<?> list = new List<Object>();
但不是
Set<List<?>> set = new HashSet<List<Object>>();