2015-02-16 2 views
0

Я мало знаю о DownCasting и Upcasting, но то, что меня смущает, ниже кода.Downcasting в Java с новым экземпляром экземпляра возвращаемого типа

Допустим, у меня есть класс Родитель и ребенок расширяет этот класс

public class Parent { 
public Parent methodA() 
{ 
    System.out.println("Parent"); 
    return this; 
} 

} 

public class Child extends Parent{ 

public void methodB() 
{ 
    System.out.println("In Child"); 
} 
} 

public static void main(String[] args) { 
    Parent p = new Child(); 
    Child c=(Child) p.methodA(); 
} 

Моя путаница в родительском классе Methoda, если я вернусь новый экземпляр Родитель затем код броски во время выполнения исключение, но если я вернуться в тот же экземпляр, то почему я не получаю ошибку.

public Parent methodA() 
{ 
    System.out.println("Parent"); 
    return new Parent(); // in this case downcasting throws error 
} 

ответ

2

Если p.methodA() возвращает тот же экземпляр (то есть р), он возвращает Child экземпляр (так как р был назначен new Child()), который может быть безопасно приведен к Child.

Если, однако, p.methodA() возвращает новый экземпляр Parent, что экземпляр не Child, и она не может быть приведен к Child.

+0

Спасибо за ваше решение он прочистил концепцию –

2

Переменная p фактически держит Child и называет methodA() на Child, который наследуется от methodA()Parent. Таким образом, this будет иметь тип Child в этом случае.

Но если вы вернетесь Parent (новый или нет, это не имеет значения), невозможно отбросить его на Child, так как он не является дочерним.

1

Когда вы говорите return this;, вы отправляете обратно указатель на объект в памяти. Тип возврата, указанный в сигнатуре метода, сообщает вызывающему, что возвращаемый объект является «видимым» как объект Parent (другими словами, с интерфейсом, объявленным определением класса Parent). Теперь, когда вы вызываете p.methodA(), он все равно возвращает ссылку this, он по-прежнему доступен для просмотра как объект Parent, но он также является объектом Child: поэтому у вас не возникнет проблем с повышением до Child.

Во второй реализации вы явно возвращает новый экземпляр объекта Parent ... который не является Child, так что вы будете иметь ClassCastException

Смежные вопросы