将子类对象添加到arraylist,同时不允许超类对象进入列表

时间:2012-07-24 10:19:39

标签: java generics

考虑以下事项;

class Mobile
{
}
class Android extends Mobile
{
}
class Iphone extends Mobile
{
}

现在我必须创建一个列表,它接受“仅”子类对象,而不是超类(Mobile)对象。

3 个答案:

答案 0 :(得分:3)

覆盖add()addAll()方法以检查object.getClass().getSimpleName()

答案 1 :(得分:3)

简而言之,没有。

总之,这是不合理的。首先,您必须知道您添加的是“参考”。对Mobile的引用可以指向Mobile,Iphone或Android的实例。是否要根据实际的实例类型进行限制,或者您希望按引用类型进行限制?

按实际的实例类型进行限制:

Mobile a = new Mobile();
Mobile b = new Iphone();
Mobile c = new Android();

aList.add(a);  //reject
aList.add(b);  //allow
aList.add(c);  //allow

按参考类型限制:

Mobile a = ...;
Iphone b = ...;
Android c = ...;

aList.add(a);  //reject
aList.add(b);  //allow
aList.add(c);  //allow

对于第一种情况,您仍然可以扩展列表并在某些方法中进行检查(当然,类型检查在运行时进行,而不是在编译时进行)

对于第二种情况,我认为你没有合理的方法来实现

答案 2 :(得分:3)

如果您被允许,可以添加标记界面Listable

interface Listable {
}    
class Mobile
{
}
class Android extends Mobile implements Listable
{
}
class Iphone extends Mobile implements Listable
{
}  

然后使用它来创建列表:

List<Listable> list = new ArrayList<Listable>();