将子类对象存储为超类并稍后检索子类

时间:2012-02-03 00:01:19

标签: java type-conversion subclass classcastexception superclass

假设我有扩展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()方法的需要来解决问题。

3 个答案:

答案 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) {

  }

如果superClassnull,则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。