【问题标题】:Storing subclass object as superclass and retrieving subclass later将子类对象存储为超类并稍后检索子类
【发布时间】:2012-02-03 00:01:19
【问题描述】:

假设我有扩展 SuperClass 的类 SubClass1 和 SubClass2。我需要将所有扩展 SuperClass 的对象存储在一个列表(列表列表)中。现在我将列表传递给一个函数,该函数可以确定 SuperClass 以前是哪个子类。然后,此函数应将 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() 方法的需要来解决问题。

【问题讨论】:

    标签: java type-conversion subclass classcastexception superclass


    【解决方案1】:

    使用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
        }
    }
    

    【讨论】:

      【解决方案2】:

      是的,

      您可以将对象的实例测试为某种类型,也就是compare the types,而不是从对象中获取类型。

      if(superClass instanceof SubClass1) {
      
        }
      

      如果superClassnull,则 if 返回 false。

      【讨论】:

        【解决方案3】:

        这个例子没有抛出任何异常。快速测试:

        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。

        【讨论】:

          猜你喜欢
          • 2013-09-03
          • 2012-07-22
          • 1970-01-01
          • 2020-11-14
          • 1970-01-01
          • 2014-03-09
          • 2018-09-09
          • 2017-08-30
          • 1970-01-01
          相关资源
          最近更新 更多