考虑以下事项;
class Mobile
{
}
class Android extends Mobile
{
}
class Iphone extends Mobile
{
}
现在我必须创建一个列表,它接受“仅”子类对象,而不是超类(Mobile)对象。
答案 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>();