从ArrayLists返回多个对象类型

时间:2015-01-07 22:24:06

标签: java

基本上我有一个班级" A"其他课程,比如" B"," C"和" D"延伸。这些类型的对象将具有不一定唯一的字符串名称。

public class A {
    //some code
}


public class B extends A {
    // some code
}

所以课程C& D也延伸A,与B相同。

接下来我有一个持有人类,有一个arraylist来持有B,C& D对象,(这里没有A对象)。

public class Holder {
    List<A> container;

    public Holder() {
        container = new ArrayList<A>();
    }

    public A getItemByName(String s) {
        //return the first object with s == name, or return null
    }

    public A getItemByType(Class c) {
        //return  the first object that matches the class or return null
    }
}

这些功能可以成功地挑选出所需的物体,但我需要将物体返回为B,C&amp; D类型。有没有办法做到这一点,如果是这样,怎么样?

3 个答案:

答案 0 :(得分:3)

你可以做到

public <T extends A> T getItemByType(Class<T> c) {
   for(Object o : container){
      if(c.isInstance(o)){
         return c.cast(o);        
      }
   }
   return null;
}

然后你就可以了

B found = holder.getItemByType(B.class);

答案 1 :(得分:1)

以下方法可用于根据getName()或提供的类型(Class)过滤掉对象。

public A getItemByName(String s) {
    return container.stream()
            .filter(obj -> s.equals(obj.getName()))
            .findFirst()
            .orElse(null);
}

public <T extends A> T getItemByType(Class<T> c) {
    return container.stream()
            .filter(c::isInstance)
            .map(c::cast)
            .findFirst()
            .orElse(null);
}

这将Java 8流与Optional - 类一起使用。我强烈建议从您的方法返回空值,而Optional类可以用来避免null检查容易出错的代码。

答案 2 :(得分:0)

它们不会被键入为B,C或D对象,因为该集合被键入为A Array。如果情况并非如此,你可能会有一个神奇的类型检查器,因为它必须在编译时知道在运行时会发生什么,或者你有一个矛盾。只需在对象之后强制转换对象,或者创建一个覆盖的函数,该函数在B,C和D对象上执行它应该做的事情。

考虑以下代码:

A [] aarray = {B1, C1, D1, B2, B3 };
if(theMoonIsFull) { aarray[3+one()] = C2; } // if the moon is full 
B hopeitsaB = aarray[4];  // this line doesn't compile