我有一个数据类型,包含一个集合和一个期望的方法List<? extends MyClass>.数据类型有Set<? extends MyClass>.我需要能够将这些东西移出集合并进入List.它进入列表的顺序无关紧要,它只需要开始跟踪它,以便在显示时可以重新排序.可以说,在数据类型中将Set更改为List是不可能的.
一开始这似乎很容易.创建一个新方法,该方法接受Set而不是List,将其更改为列表,然后将其传递给刚刚接受列表的旧方法.将设置更改为列表会出现问题.
public void setData(Set<? extends MyClass> data) {
List<? extends Myclass> newData = ArrayList< /* What goes here? */ >();
for(ConcordaEntityBean o : data) {
newData.add(o);
}
setData(newData);
}
Run Code Online (Sandbox Code Playgroud)
显然,我不能用通配符实例化一个ArrayList,它会窒息.那时我不知道那种类型.有没有办法从数据中提取类型并将其传递给ArrayList?我可以用它实例化MyClass吗?还有其他方法可以做到这一点吗?
你无法实例化它,MyClass因为newData它不一定是类型List<MyClass>,Java不支持协方差(即,Sextends T并不意味着它ArrayList<S>是一个子类型ArrayList<T>).
你能做的是:
List<MyClass> newData = new ArrayList<MyClass>();
现在,可以放入Set(保证是子类型MyClass)中的所有内容newData.
一般而言,通配符类型强制实施边界约束.你知道这Set<? extends MyClass>是一个Set参数化的某种类型,并且该类型是从上面限制的MyClass.因此,当您处理来自该元素的元素时Set,您最好不要将它们视为MyClass对象.