Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将子类对象添加到arraylist,同时不允许超类对象进入列表_Java_Generics - Fatal编程技术网

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的引用,您只能在运行时进行类型检查)