将泛型与遗留代码一起使用

时间:2011-08-29 20:00:34

标签: java generics

在我的项目中,我们使用的外部API不是通用的,因此有一个名为ItemList的类是java.util.List的实现,它包含Item个对象的列表。但是在我们的新代码中,我们将其表示为List<Item>,我想编写一个可以同时使用ItemListList<Item>的方法, 我试过这种签名:

public static void readList(List<?> list) {}

它工作正常,但问题是此方法中有ObjectItem的强制转换,当参数为ItemList时使用,而List<Item>不需要1}},有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

如果ItemListList的实现,并且如果您知道它包含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
}