Для ссылочных типов восходящий поток неявный (или, по крайней мере, то, что, на ваш взгляд, означает неявный — это не стандартная терминология 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 генерирует новую копию значения в представлении машины типа литья.
Что вы подразумеваете под * implicit * type casting? –
Единственное неявное литье для ссылочных типов (исключая Autoboxing для сортированных примитивных оберток) - это «* upcasting *», которое на самом деле является просто применением инверсии принципа [Liskov substitution] (http://en.wikipedia.org/wiki/Liskov_substitution_principle). – user2864740
@ user2864740 - К сожалению. Мой экран не обновился. –