如何在异构List中查找给定类型的对象

我有一个异构List,可以包含任何类型的对象。 我需要找到一个特定类型的List元素。 通过查看其他generics相关问题的答案,我找不到我需要的内容。

这是我要完成的一个例子:

List  list = new ArrayList (); ... private someMethod() { Customer cust = findInList( Customer.class ); Invoice inv = findInList( Invoice.class ); } 

那么,如何使用generics定义findInList ? 我认为类型擦除会导致问题,我不太了解这个问题,但我不想定义多个“查找”方法,因为列表中可能存在数十种不同类型的对象。

您可以使用[ Class.isInstance() ]定义方法( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#isInstance(java.lang.Object) )和[ Class.cast() ]( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#cast Class.cast() ))方法。 这是一个示例实现(列表的额外参数):

 static  T findInList(List list, Class clazz) { for (Object o : list) { if (clazz.isInstance(o)) { return clazz.cast(o); } } return null; } 

更新:我建议不要在Collection中放置多种类型。 它通常是需要自定义数据类型(例如Transaction )或Tuple值的标志。

您可以使用Josh Bloch描述的Typesafe异构容器模式。 以下是乔希的演讲中的一个例子:

 class Favorites { private Map, Object> favorites = new HashMap, Object>(); public  void setFavorite(Class klass, T thing) { favorites.put(klass, thing); } public  T getFavorite(Class klass) { return klass.cast(favorites.get(klass)); } public static void main(String[] args) { Favorites f = new Favorites(); f.setFavorite(String.class, "Java"); f.setFavorite(Integer.class, 0xcafebabe); String s = f.getFavorite(String.class); int i = f.getFavorite(Integer.class); } } 

您可以轻松扩展它以支持每种类型的collections夹列表而不是单个值。