您可以尝试使用反射:
public abstract class AClonable implements Cloneable{private String val;public AClonable(){}public AClonable(String s){ val=s;}public String toString(){ return val;}@Overridepublic AClonable clone(){ try { System.out.println(getClass().getCanonicalName()); AClonable b= getClass().getDeclaredConstructor(String.class).newInstance(val); return b; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null;}}
在clone()方法中,调用getClass()。因为ACloneble ist抽象,所以那里的调用将始终转到具体的类。
public class ClonebaleOne extends AClonable{public ClonebaleOne(){ super();}public ClonebaleOne(String s) { super(s); // TODO Auto-generated constructor stub}}
和
public class ClonebaleTwo extends AClonable{public ClonebaleTwo(){ super();}public ClonebaleTwo(String s) { super(s); // TODO Auto-generated constructor stub}}
最后
public static void main(String[] args){ AClonable one = new ClonebaleOne("One"); AClonable tow= new ClonebaleTwo("Two"); AClonable clone = one.clone(); System.out.println(clone.toString()); clone = tow.clone(); System.out.println(clone.toString());}输出:
ClonebaleOne One ClonebaleTwo Two
但这不是解决方案,而是更多技巧
[编辑]我的两个克隆都比;)快
[编辑]要完成。clone()的另一个实现可以是
@Overridepublic AClonable clone(){ try { ByteArrayOutputStream outByte = new ByteArrayOutputStream(); ObjectOutputStream outObj = new ObjectOutputStream(outByte); ByteArrayInputStream inByte; ObjectInputStream inObject; outObj.writeObject(this); outObj.close(); byte[] buffer = outByte.toByteArray(); inByte = new ByteArrayInputStream(buffer); inObject = new ObjectInputStream(inByte); @SuppressWarnings("unchecked") Object deepcopy = inObject.readObject(); inObject.close(); return (AClonable) deepcopy; } catch (Exception e) { e.printStackTrace(); } return null;}当您的抽象类实现Serialazable时。在那里,您将对象写入光盘,并使用光盘中的值创建副本。



