如何在异构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夹列表而不是单个值。