假设我有扩展SuperClass的类SubClass1和SubClass2。我需要将所有扩展SuperClass的对象存储在列表中(列表列表)。现在我将列表传递给一个函数,该函数可以确定SuperClass之前的SubClass。然后,此函数应将SuperClass重新转换回其各自的子类。例如,
for (SuperClass superClass : list) {
if (superClass.getType().equals("SubClass1")
SubClass1 subClass = (SubClass1) superClass;
else if (superClass.getType().equals("SubClass2")
SubClass2 subClass = (SubClass2) superClass;
}
此示例将导致类强制转换异常。是否有任何简单的解决方案来获得此功能?
编辑:正如其中一个答案中所提到的,此代码应该导致异常。在此示例中,getType()方法必定存在问题。但是,使用instanceof关键字的解决方案通过消除对getType()方法的需要来解决问题。
答案 0 :(得分:5)
使用instanceof operator。您可以将代码转换为:
for (SuperClass superClass: list) {
if (superClass instanceof SubClass1) {
SubClass1 subClass = (SubClass1) superClass;
}
else if (superClass instanceof SubClass2) {
SubClass2 subClass = (SubClass2) superClass;
}
else {
// Something strange has happened, or superClass is null
}
}
答案 1 :(得分:1)
是的,
不是从对象到达类型,而是可以将对象的实例测试为其他单词compare the types中的某种类型。
if(superClass instanceof SubClass1) {
}
如果superClass
为null
,则if返回false。
答案 2 :(得分:1)
此示例不会抛出任何异常。快速测试:
List<SuperClass> list = new ArrayList<SuperClass>();
int count = 50;
Random random = new Random();
while(count-- > 0) {
if(random.nextBoolean()) {
list.add(new SubClass1());
} else {
list.add(new SubClass2());
}
}
for (SuperClass superClass : list ) {
if (superClass.getType().equals("SubClass1")){
SubClass1 subClass = (SubClass1) superClass;
System.out.println(subClass);
}else if (superClass.getType().equals("SubClass2")){
SubClass2 subClass = (SubClass2) superClass;
System.out.println(subClass);
}
}
如果你有类强制转换异常,那么其中一个类的getType()
实现很可能会返回错误的值,这就是为什么你有类转换异常的原因。或者你的一个子类没有扩展SuperClass。