【问题标题】:finding specific type of list in ArrayList<ArrayList<?>>在 ArrayList<ArrayList<?>> 中查找特定类型的列表
【发布时间】:2014-04-30 05:19:33
【问题描述】:

假设我有一个衣柜,我可以放清单,清单,..

ArrayList<ArrayList<?>> wardrobe

然后我想列出特定类型的项目。

如果我说列出我所有的衬衫,

我想到了

public <T> ArrayList<?> getAllItems() {
    for (ArrayList<?> itemList : wardrobe) {
        Iterator<?> iterator = itemList.iterator();
        if(iterator.hasNext()){
            Object next = iterator.next();
            if(next.getClass().equals(T)) return itemList;
        }
    }
    return null;
}
  1. 但这是一个错误!我错过了什么吗(误解了泛型概念?)!
  2. 我怎样才能做到这一点?

我想打电话

<Shirt>getAllItems();

【问题讨论】:

  • @DineshKumar 如果你正在使用 T-Shirt 之类的键-> List 你可以使用 HashMap>
  • 为什么在这种情况下还要费心使用泛型?为什么不简单地ArrayList&lt;ArrayList&gt;&gt; wardrobe
  • @IwishIcouldthinkofagood:是的,没关系!但是我如何从中检索特定类型的列表?
  • instanceOf 不起作用吗?

标签: java generics arraylist


【解决方案1】:

像这样改变你的方法定义

public <T> ArrayList<?> getAllItems(Class<T> clazz) {
    for (ArrayList<?> itemList : wardrobe) {
        Iterator<?> iterator = itemList.iterator();
        if(iterator.hasNext()){
            Object next = iterator.next();
            if(next.getClass().equals(clazz)) return itemList;
        }
    }
    return null;
}

然后,拨打&lt;Shirt&gt; getAllItems(Shirt.class);

希望这会有所帮助!

【讨论】:

  • T classType 作为参数太有效了!但是 class 是什么意思?
  • 通用信息在运行时被删除,无法恢复。一种解决方法是传递 Class in 参数。它只是一个泛型类型 T 的类。但是,它很丑 ;)
  • 为什么说它丑?
  • 除了 T.class,你必须将它作为 Class 类传递到任何你需要知道泛型类型的类的地方。
  • 还有其他建议的方式吗?
【解决方案2】:

这不起作用,因为方法内部并不真正知道T 是什么(因为Java 泛型按类型erasure 工作)。相反,您应该:

  • 依靠泛型系统为您执行任务并停止尝试检查它们,或者
  • 传入您正在搜索的显式类。 (如果您正在寻找 Cat 类并且 TAnimal,这也会有所帮助,假设 CatAnimal 的子类型。)
public <T> ArrayList<T> getAllItems(Class<T> clazz) {
    for (ArrayList<?> itemList : wardrobe) {
        Iterator<?> iterator = itemList.iterator();
        if(iterator.hasNext()){
            Object next = iterator.next();
            if(clazz.isAssignableFrom(next.getClass()))
                return (ArrayList<T>)itemList;
        }
    }
    return null;
}

您需要在此处取消一些警告,因为演员表形式上是不安全的,但只要wardrobe 中的每个列表确实是单一类型的元素(或者至少他们没有一个共享的超类)。

【讨论】:

  • Class 和 T clazz 一样吗?
  • @Dineshkumar 是的,这就是你告诉方法 T 实际上是什么的方式,因为这是它实际需要该信息的情况。
  • 我无法将结果分配回 ArrayList
  • 对不起,如果我有参数为 (T classType) 那么它的错误
  • @Dineshkumar 好吧,当我用 Java 7 测试它时它可以工作,所以我不知道你遇到了什么问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2015-12-29
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多