在我的项目中,我们使用的外部API不是通用的,因此有一个名为ItemList
的类是java.util.List
的实现,它包含Item
个对象的列表。但是在我们的新代码中,我们将其表示为List<Item>
,我想编写一个可以同时使用ItemList
和List<Item>
的方法,
我试过这种签名:
public static void readList(List<?> list) {}
它工作正常,但问题是此方法中有Object
到Item
的强制转换,当参数为ItemList
时使用,而List<Item>
不需要1}},有更好的方法吗?
答案 0 :(得分:4)
如果ItemList
是List
的实现,并且如果您知道它包含Item
个实例,则只需将其转换为List<Item>
。您将获得类型安全警告,但它并不比将ItemList
的每个元素转换为Item
安全。
答案 1 :(得分:2)
您是否可以编写新的API来处理List<Item>
,以便继续前进,然后提供静态转换方法作为旧版本List<Item> asList(ItemList itemList)
的适配器?通过这种方式,您可以找到丑陋的未经检查的转换发生的位置。
答案 2 :(得分:1)
如何提供两种方法 - 每种参数类型一种。至少在一个已经讨论和接受的已知位置只有一个类型安全警告:
public static void readList(List<Item> list) {
// do something
}
@SuppressWarnings("unchecked")
public static void readItemList(List<?> list) {
readList((List<Item>)list); // Type safety warning tucked away in here
}
虽然您没有类型安全性,但方法readItemList
的名称至少是对它们预期传递的列表类型的编码器的强烈暗示。
答案 3 :(得分:0)
如果我正确地阅读API,java.lang.Class:getTypeParameters()看起来很有希望。 尝试:
if(list.getClass().getTypeParameters().length == 0) {
// Code for non-generic
} else {
// Genericized
}