Java 将子类对象添加到arraylist,同时不允许超类对象进入列表
考虑以下几点:Java 将子类对象添加到arraylist,同时不允许超类对象进入列表,java,generics,Java,Generics,考虑以下几点: class Mobile { } class Android extends Mobile { } class Iphone extends Mobile { } 现在我必须创建一个只接受子类对象而不接受超级类(移动)对象的列表。覆盖add()和addAll()方法来检查对象。getClass().getSimpleName()简言之,否 从长远来看,这是不合理的。首先,你必须知道你添加的是一个“参考”。对Mobile的引用可以指向Mobile、Iphone或Android的实
class Mobile
{
}
class Android extends Mobile
{
}
class Iphone extends Mobile
{
}
现在我必须创建一个只接受子类对象而不接受超级类(移动)对象的列表。覆盖add()
和addAll()
方法来检查对象。getClass().getSimpleName()
简言之,否
从长远来看,这是不合理的。首先,你必须知道你添加的是一个“参考”。对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
对于第一种情况,您仍然可以扩展列表并在某些方法中进行检查(当然,类型检查是在运行时进行的,而不是在编译时)
对于第二种情况,我认为您没有合理的方法来实现如果允许的话,您可以添加一个标记接口
列表
:
interface Listable {
}
class Mobile
{
}
class Android extends Mobile implements Listable
{
}
class Iphone extends Mobile implements Listable
{
}
然后使用此选项创建列表:
List<Listable> list = new ArrayList<Listable>();
List List=new ArrayList();
请问您为什么要这样做?这似乎是多态性的一种奇怪用法。在采访中面对这个qn…虽然它会起作用,但可能还有另一种方法来实现OP的目标,如果没有它…@assy绝对,取决于用户的需求这是一个合理的解决方案。任何可接受的解决方案(从面向对象的角度来看)要么是实现公共接口,要么是从公共基类扩展。对于案例1,它是您自己编写的列表(请注意关键字“extend”),并且是在运行时完成的,这意味着您不依赖泛型进行编译时类型检查(您不能这样做,因为您传入的是对Mobile的引用,您只能在运行时进行类型检查)