基本上我有一个班级" 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类型。有没有办法做到这一点,如果是这样,怎么样?
答案 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