如何从列表中按类型获取对象

时间:2014-10-11 20:24:08

标签: java collections types

我有几个班级和一些名单:

A
B : A
C : A
D : A
...
SomeList<A> list

通过C#,我可以按类型获得所需的对象:

public T getObject <T> () where T : A {
    return (T)objects[typeof(T)];
}

public A objects [Type _type] {
    get {
        var temp = from _a in _list where _a.GetType() == _type select _a;
        return temp.FirstOrDefault();
    }
}

如何使用java获取它?

5 个答案:

答案 0 :(得分:1)

在Java中你会这样做:

public <T> T getObjectByType(Class<T> cl) {
    for (Object item : _list) {
        cl.isInstance(item) {
            return (T)item;
        }
    }
    return null;
}

您可以这样称呼它:

B b = someList.getObjectByType<B>(B.class);

您也可以在C#中以相同的方式执行此操作,但LINQ使其更简单。

答案 1 :(得分:1)

如果你知道对象的可能类型,你可以使用

  

instanceof

operator.例如:

SomeList<A> list;
for(int i = 0; i < list.size(); i++){
    if( list.get(i) instanceof  AClass){
       .....
    }else if(list.get(i) instanceof BClass){
      .....
    }
}

答案 2 :(得分:1)

您可以在java中使用instanceof来检查对象类型。

for (T x : list) {
   if (T instanceof MyClass) {
     // Do your stuff...
   }
}

答案 3 :(得分:1)

我不知道C#。但是,在Java中,如果您有一个地图,并且希望收集按类型检索的给定类型的单个对象,则可以执行以下操作:

Map byType = new HashMap<Class<A>, A>();

void insertObject(Object v) {
   byType.put(v.getClass(), v);
}

Object getObject(Class c) {
    return byType.get(c);
}

当然,您只能存储给定类型(类)的单个对象。如果要存储给定类型的多个对象,可能需要使用muitimap。有许多库包括这样的集合,例如org.apache.commons.collections,google的guava(com.google.common.collect)等。

HTH

-Steve

答案 4 :(得分:1)

您可以像这样在Java中使用instanceOf。

import java.util.ArrayList; import java.util.List;

public class Test{

    public static void main(String[] args){
        /*
         * List of A object
         */
        List<A> objectList = new ArrayList();

        /*
         * Adding object to the list
         */
        objectList.add(new A());
        objectList.add(new B());
        objectList.add(new B());

        /*
         * Iterate through list and display object's type
         */
        for(A a : objectList) {
            if(a instanceof A) {
                System.out.println(a.getClass().getName());
            }
            if(a instanceof B) {
                System.out.println(a.getClass().getName());
            }
        }

    }

    /*
     * 
     */
    static class A {

    }

    static class B extends A {

    }

    static class C extends A {

    }
}