【问题标题】:Getting object from an ArrayList<T> of a specific type in java从 java 中特定类型的 ArrayList<T> 获取对象
【发布时间】:2011-07-10 09:35:13
【问题描述】:

我有一个 ArrayList,例如 b,我想从该 ArrayList 中获取 Worker 的 ArrayList(Worker extend Person)。 b 还包含从 Person 扩展而来的其他对象。

我怎样才能做到这一点? 谢谢。

【问题讨论】:

    标签: java types arraylist


    【解决方案1】:

    像这样声明你的ArrayList

    ArrayList<Worker> myArray = new ArrayList<Worker>()
    

    现在您的ArrayList 只能包含Worker,其不同方法的返回类型将是Worker

    然后:

    for(Person p : b) {
        if(p instanceof Worker)
            myArray.add((Worker)p);
    }
    

    【讨论】:

      【解决方案2】:

      如果你使用Guava,就这么简单:

      ArrayList<Person> b;
      ArrayList<Worker> a = Lists.newArrayList(Iterables.filter(b, Worker.class));
      

      【讨论】:

        【解决方案3】:

        这是一个例子:

        List<Person> b = ...
        
        List<Worker> workers = new ArrayList<Worker>();
        for (Person p : b) {
          if (p instanceof Worker) { workers.add((Worker) p); }
        }
        

        【讨论】:

          【解决方案4】:

          当按照Krtekh3r3 的建议遍历ArrayList b 时,请考虑使用Worker.class.isAssignableFrom(p.class)。查看What is the difference between instanceof and Class.isAssignableFrom(...)? 以了解差异。

          【讨论】:

          • 这根本不是一个好主意。类型在编译时是已知的;为什么要使用反射?也许你应该看看链接。
          • 为什么马克是个坏主意?请帮我理解。
          【解决方案5】:

          嗯,我的目标实现了:

          public ArrayList<Person> getList(Class<? extends Person> type) {
              ArrayList<Person> newList = new ArrayList<Person>();
          
              for (Person p : person)
                  if (type.isInstance(p))
                      newList.add(p);
          
              return newList;
          }
          

          我用一个 dinamyc 子类的人扩展了我的问题。 我希望对其他人有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-26
            • 1970-01-01
            • 2017-01-06
            • 1970-01-01
            • 2018-05-26
            • 1970-01-01
            • 1970-01-01
            • 2022-08-15
            相关资源
            最近更新 更多