当前位置:  开发笔记 > 编程语言 > 正文

Java中的"动态"转换

如何解决《Java中的"动态"转换》经验,为你挑选了2个好方法。

Hullo all,

想知道是否有任何Java黑客可以告诉我为什么以下不起作用:

public class Parent {
    public Parent copy() {
       Parent aCopy = new Parent();
       ...
       return aCopy;
    }
}

public class ChildN extends Parent {
    ...
}

public class Driver {
     public static void main(String[] args) {
         ChildN orig = new ChildN();
         ...
         ChildN copy = orig.getClass().cast(orig.copy());
     }
}

代码很高兴编译,但决定在运行时D =抛出ClassCastException

编辑:哇,真的很快回复.多谢你们!所以我似乎无法使用这种方法向下转换...有没有其他方法可以在Java中进行向下转换?我确实考虑过让每个ChildN类都覆盖copy(),但是并不热衷于添加额外的样板代码.



1> OscarRyz..:

就像试图这样做:

  public Object copy(){
       return new Object();
  }

然后尝试:

  String s = ( String ) copy();

您的Parent类和ChildN类与ObjectString具有相同的关系

要使其工作,您需要执行以下操作:

public class ChildN extends Parent {
    public Parent copy() {
        return new ChildN();
    }
}

也就是说,覆盖"复制"方法并返回正确的实例.


编辑

根据你的编辑.这实际上是可能的.这可能是一种可能的方式:

public class Parent {
    public Parent copy() {
        Parent copy = this.getClass().newInstance();
        //...
        return copy;
    }
}

这样您就不必重写每个子类中的"copy"方法.这是Prototype设计模式.

但是,使用此实现,您应该知道两个已检查的异常.这是编译和运行没有问题的完整程序.

public class Parent {
    public Parent copy()  throws InstantiationException, IllegalAccessException  {
       Parent copy = this.getClass().newInstance();
       //...
       return copy;
    }
}
class ChildN  extends Parent {}

class Driver {
     public static void main(String[] args) throws  InstantiationException ,  IllegalAccessException  {
         ChildN orig = new ChildN();
         ChildN copy = orig.getClass().cast(orig.copy());
         System.out.println( "Greetings from : " + copy );
    }
}



2> Jon Skeet..:

演员有效地尝试这样做:

ChildN copy = (ChildN) orig.copy();

(它的工作出在执行时间,执行转换,但是这会是因为什么orig.getClass()ChildN.class),但orig.copy()不会返回ChildN的实例,它返回的只是一个实例Parent,所以它不能被转换为ChildN.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有