2014-10-05 2 views
0

Мы часто заканчиваем использование литья типов в Java, где мы отбрасываем объект один в другой в той же иерархии.Неявная работа по литью типов в Java

Я, однако, не нашел ни одного материала, объясняющего, как типовое литье работало неявно.

Любой, кто может пролить свет, пожалуйста.

Edit:

Что я имею в виду, чтобы спросить, дали код Superclass а = новый Подкласс(); // не требуется кастинг Подкласс b = (Подкласс) a; // литой требуется

Как Java выполняет литье типов из класса SuperClass в SubClass.

Хотя большинство сообщений говорят, что Java автоматически это делает, мне было немного любопытно узнать, что он делает автоматически?

+0

Что вы подразумеваете под * implicit * type casting? –

+0

Единственное неявное литье для ссылочных типов (исключая Autoboxing для сортированных примитивных оберток) - это «* upcasting *», которое на самом деле является просто применением инверсии принципа [Liskov substitution] (http://en.wikipedia.org/wiki/Liskov_substitution_principle). – user2864740

+0

@ user2864740 - К сожалению. Мой экран не обновился. –

ответ

3

Для ссылочных типов восходящий поток неявный (или, по крайней мере, то, что, на ваш взгляд, означает неявный — это не стандартная терминология Java). Нет никакого скрытого понижающего литья. Так что если у вас есть Superclass базовый класс и Subclass класс, который расширяет Superclass, вы можете сделать это:

Subclass a = new Subclass(); 
Superclass b = a; // no cast needed. 

Однако, для этого:

Superclass a = new Subclass(); // no cast needed 
Subclass b = (Subclass) a; // cast required 

Обратите внимание, что в целом вы подвержены риску бросать ClassCastException, когда вы опускаетесь, если не можете гарантировать, что downcast будет работать. Обычно это делается с помощью оператора instanceof:

Superclass a = new Subclass(); // no cast needed 
Subclass b; 
if (a instanceof Subclass) { 
    b = (Subclass) a; // cast required 
} else { 
    // handle problem of a being a different subtype of Superclass 
} 

Стандартной терминологии для приведения к базовому типа является расширением и понижающего приведения этого сужения от типа.

EDIT (на основе редактирования на вопрос):

Я не знаю, что эти сообщения вы цитируете средний, если это не в следующем. В Java все переменные ссылочного типа - это только ссылки на —. Все, что происходит, когда Java выполняет:

Subclass b = (Subclass) a; // cast required 

является то, что он присваивая ссылку, хранящуюся в a к b после первой проверки, что объект на который ссылается a присваиванию совместит с заявленным типом b. (Обратите внимание, что вышеизложенное не означает, что объект имеет тот же тип, что и b —, он может быть подтипом.) Сам объект никак не преобразуется в новую структуру объекта. Любые изменения, внесенные вами во внутренний объект через b, будут видны, если вы затем получите доступ к объекту через a (при условии, что изменения повлияют на более абстрактный вид объекта, представленный a). В некотором смысле, a и b - это псевдонимы (обычно с разным общим apis) для одного и того же объекта.

Ошибка при проверке совместимости. Вы получите ошибку времени компиляции, если проверка не может быть выполнена.Таким образом, вы не можете получить это в прошлом компилятора:

String x = "Hello world"; 
Integer y = (Integer) x; // compiler error 

наложение спектры описаны выше не происходит при забросе примитивных значений —, таких как от int до long. В этих случаях Java генерирует новую копию значения в представлении машины типа литья.

+0

Извините за терминологию. Я отредактировал этот вопрос, чтобы уточнить его. То, что я намеревался спросить, - это то, что делает Java именно для того, чтобы передать один тип класса другому, когда он выполняет подкласс b = (подкласс) a; –

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