for (SubItem i : List<Item>) {
//do something
}
以上施工不起作用。我需要在循环中多次使用i-variable。我目前的解决方案是在第一行创建一个新的,变换的变量。
for (Item i : List<Item>) {
SubItem si = (SubItem) i;
//do something
}
有更好的方法吗?
修改 列表中的所有项都是子项,因此我不必检查instanceOf。基本上我想要的是一个避免检查类实例的方法,如果我有一个加扰的集合
答案 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,它将在从列表中选择的时候导致类转换。无论如何,泛型当然大多只是语法糖。把它们想象成是在幕后完成演员表。