0

考虑以下;

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

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

4

3 回答 3

3

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

于 2012-07-24T10:22:33.117 回答
3

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

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

然后使用它来创建列表:

List<Listable> list = new ArrayList<Listable>();
于 2012-07-24T10:29:36.233 回答
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

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

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

于 2012-07-24T10:26:36.507 回答