簡體   English   中英

如何在異構List中查找給定類型的對象

[英]How to find object of given type in a heterogeneous List

我有一個異構List,可以包含任何類型的對象。 我需要找到一個特定類型的List元素。 通過查看其他泛型相關問題的答案,我找不到我需要的內容。

這是我想要完成的一個例子:

List <Object> list = new ArrayList <Object>(); 

...

private someMethod() {
   Customer cust = findInList( Customer.class );
   Invoice inv = findInList( Invoice.class );
}

那么,我如何使用泛型定義findInList 我認為類型擦除會導致問題,我不太了解這個問題,但我不想定義多個“查找”方法,因為列表中可能存在數十種不同類型的對象。

您可以使用Josh Bloch描述的Typesafe異構容器模式。 以下是Josh演講的一個例子:

class Favorites {
    private Map<Class<?>, Object> favorites =
            new HashMap<Class<?>, Object>();

    public <T> void setFavorite(Class<T> klass, T thing) {
        favorites.put(klass, thing);
    }

    public <T> T getFavorite(Class<T> 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);
    }
}

您可以輕松擴展它以支持每種類型的收藏夾列表而不是單個值。

您可以使用[ 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> T findInList(List<?> list, Class<T> clazz) {
  for (Object o : list) {
    if (clazz.isInstance(o)) {
      return clazz.cast(o);
    }
  }
  return null;
}

更新:我建議不要在Collection多種類型。 它通常是需要自定義數據類型(例如Transaction )或Tuple值的標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM