[英]Convert ArrayList<String> to ArrayList<Object>
如果类型B
可以推广到类型A
,如何将List<B>
转换为List<A>
? 我需要一个循环:
List<A> newList=new ArrayList<A>();
for(B t:oldList) newList.add(t);
编辑:我不知道它的含义,但我的意思是说类型B
的对象可以被转换为类型A
的对象(如B implements A
)。
Edit2:似乎构造函数也有效:
List<A> newList=new ArrayList<A>(oldList);
但是,我想要一种更有效的方法,而不仅仅是复制列表。
你不应该因为List<B>
意味着它只包含B类或子类型的元素。 List<A>
允许您添加类型A的元素,这可能是危险的。 因此,您不应将List<B>
List<A>
转换为List<A>
。
如果您创建一个新的List<A>
并将List<B>
所有元素放入其中(例如使用可能包含在方法中的循环),那就没问题。
填充新列表的一种简单方法是addAll()
方法,例如
List<A> aList = ...;
List<B> bList = ...;
aList.addAll( bList );
正如您在评论中所述 ,如果您的Class B implements Class A
,则以下代码完全正常。
newList.addAll(listofBs);
由于每个B
都是A
,因此您可以这样做。
是的,你不需要循环。
泛型不允许您直接向上转换集合对象。
你可以做几件事:
List<B> oldList = new List<B>();
List<? super B> upcastedList = oldList; // No new object created.
如果您需要将列表强制转换为特定类型(例如A),那么除了循环每个元素并将其添加到新列表(如您在问题中指定的那样)之外,您别无选择。
它可以在创建过程中添加
List<A> newList = new ArrayList<A>(oldList);
如果你可以使用listA不可修改,那么这是另一个可能的答案(使用Ankur的提示):
List<B> listB=new ArrayList<B>();
List<A> listA=Collections.unmodifiableList((List<? extends A>)listB);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.