【问题标题】:Check ArrayList for instance of object检查 ArrayList 以获取对象实例
【发布时间】:2011-06-14 21:05:59
【问题描述】:

我有一个 java 方法,它应该检查 ArrayList 并检查它是否包含给定类的实例。我需要将要检查的类的类型作为参数传递给方法,如果 List 包含给定类型的对象,则返回它。

这可以实现吗?

【问题讨论】:

    标签: java arraylist instanceof


    【解决方案1】:
    public static <T> T find(Collection<?> arrayList, Class<T> clazz)
    {
        for(Object o : arrayList)
        {
            if (o != null && o.getClass() == clazz)
            {
                return clazz.cast(o);
            }
        }
    
        return null;    
    }
    

    然后打电话

    String match = find(myArrayList, String.class);
    

    【讨论】:

    • 您需要使用Class.isAssignableFrom来处理子类,并且该方法应该使用Collection而不是ArrayList(即编程到接口)。还可以考虑使用 Java 推荐的使方法名称以小写开头的编码标准。
    • @Steve Kuo:或Class.isInstance
    【解决方案2】:
    public static <T> T getFirstElementOfTypeIn( List<?> list, Class<T> clazz )
    {
      for ( Object o : list )
      {
        if ( clazz.isAssignableFrom( o.getClass() ) )
        {
          return clazz.cast( o );
        }
      }
      return null;
    }
    

    【讨论】:

    • clazz.isAssignableFrom( o.getClass() )可以写成clazz.isInstance( o )
    【解决方案3】:

    如果您使用的是 Java 8,您可以这样做:

    public <T> Optional<T> getInstanceOf(Class<T> clazz, Collection<?> collection) {
        return (Optional<T>) collection.stream()
                .filter(e -> clazz.isInstance(e.getClass()))
                .findFirst();
    }
    

    如果您以前从未使用过Optional,请查看它的文档。实际上这比returning null 更好。

    【讨论】:

      【解决方案4】:

      您可以遍历列表并测试每个元素

      Class<?> zz = String.class;
      for (Object obj : list) {
          if (zz.isInstance(obj)) {
              System.out.println("Yes it is a string");
          }
      }
      

      请注意,isInstance 也捕获子类。否则请参阅 Bela 的回答。

      【讨论】:

      • 这已被否决,但似乎是更好的解决方案,您不关心您正在检查的类或子类的子类;就我而言,正如帖子所解释的那样。那么为什么投反对票呢?如果不能给出好的解释,我赞成。
      【解决方案5】:

      检查列表中的项目实例之一

      if (object instanceof ArrayList<?>) {
                              if (((ArrayList<?>) object).get(0) instanceof ClassA) {
                                  classAList= (ArrayList<ClassA>) object;
                              } else if (((ArrayList<?>) object).get(0) instanceof ClassB) {
                                  classBList= (ArrayList<classB>) object;
                              } else if (((ArrayList<?>) object).get(0) instanceof ClassC) {
                                  classCList= (ArrayList<ClassC>) object;
                              }
                          }
      

      【讨论】:

        猜你喜欢
        • 2015-08-19
        • 2022-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多