for-collection中的每个子元素,Java

时间:2013-12-10 06:28:18

标签: java foreach

for (SubItem i : List<Item>) {
  //do something        
}

以上施工不起作用。我需要在循环中多次使用i-variable。我目前的解决方案是在第一行创建一个新的,变换的变量。

for (Item i : List<Item>) {
SubItem si = (SubItem) i;
 //do something     
}

有更好的方法吗?

修改 列表中的所有项都是子项,因此我不必检查instanceOf。基本上我想要的是一个避免检查类实例的方法,如果我有一个加扰的集合

3 个答案:

答案 0 :(得分:1)

您无法自动投射到更详细的类型。你可以这样做:

List<SubItem> subItemList = new ArrayList<SubItem>();
for (Item i : subItemList) {
  //do something        
}

在你的情况下你必须手动施放,例如:

List<Item> itemList = new ArrayList<Item>(); 
List<SubItem> subItemList = (List) itemList; 
for (SubItem i : subItemList) {
  //do something        
}

我所做的演员目的是没有通用类型。使用提供的泛型类型(List<SubItem>)它将无法编译。请记住,如果itemList中的任何元素不属于SubItem类型,那么在演员表中会遇到RuntimeException。

答案 1 :(得分:0)

for (SubItem i : List<Item>) {
  //do something        
}

这显然是错误的。您必须使用支持每个循环的类对象而不是类名。

List<Item> itemList = new ArrayList<Item>();
for (SubItem i : itemList) {
  //do something        
}

同样,多态性正在为子类对象使用超类引用而不是另一种方式。因此,如果您的列表包含Item对象,并且在循环中需要SubItem,则需要键入cast。或维护一个SubItem列表而不是Item(以泛型方式)。

答案 2 :(得分:0)

试试这个..

List<Item> itemList = ...;
for (SubItem i : (List<SubItem>)(Object)itemList) {
  //do something        
}

泛型不会像常规对象那样使用继承进行转换。如果需要,可以将Item列表转换为SubItem列表。我发现我需要通过一个Object进行转换,以使编译器接受它。当然,如果列表不包含SubItem,它将在从列表中选择的时候导致类转换。无论如何,泛型当然大多只是语法糖。把它们想象成是在幕后完成演员表。