考虑以下;
class Mobile
{
}
class Android extends Mobile
{
}
class Iphone extends Mobile
{
}
现在我必须创建一个“仅”接受子类对象而不是超类(移动)对象的列表。
覆盖add()
和addAll()
检查方法object.getClass().getSimpleName()
如果允许,您可以添加一个标记界面Listable
:
interface Listable {
}
class Mobile
{
}
class Android extends Mobile implements Listable
{
}
class Iphone extends Mobile implements Listable
{
}
然后使用它来创建列表:
List<Listable> list = new ArrayList<Listable>();
简而言之,没有。
总而言之,这是不合理的。首先,您必须知道您添加的是“参考”。对 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
对于第一种情况,您仍然可以扩展列表并在某些方法中进行检查(当然,类型检查发生在运行时,而不是编译时)
对于第二种情况,我认为您没有合理的方法来实现