Это все равно что пытаться сделать это:
public Object copy(){
return new Object();
}
А затем попытайтесь:
String s = ( String ) copy();
Ваш Родительский класс и ChildN класс имеют такие же отношения, как Объект и Строка
Чтобы это работало, вам нужно сделать следующее:
public class ChildN extends Parent {
public Parent copy() {
return new ChildN();
}
}
То есть переопределить метод "copy" и вернуть правильный экземпляр.
EDIT
Согласно вашему редактированию. Это на самом деле возможно. Это может быть один из возможных способов:
public class Parent {
public Parent copy() {
Parent copy = this.getClass().newInstance();
//...
return copy;
}
}
Таким образом, вам не нужно переопределять метод «copy» в каждом подклассе. Это шаблон дизайна прототипа.
Однако, используя эту реализацию, вы должны знать два проверенных исключения. Вот полная программа, которая компилируется и запускается без проблем.
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 );
}
}