Кастинг имеет разные виды использования. К сожалению, ваш пример не использует какой-либо полезный пример кастинга, поскольку вы создаете экземпляр A
(a
), а затем отбрасываете его на A
.
Что вам нужно для понимания, есть вид и актуальные типы. Очевидным типом будет List<T> list;
. Здесь мы видим, что это список. Но фактическим типом может быть ArrayList<T>
(List<T> list = new ArrayList<>();
). В этом сценарии мы с осторожностью можем отобразить видимый тип для фактического типа. Это позволило бы нам использовать функциональные возможности фактического типа. Например, давайте посмотрим на некоторый код; Дано:
List<Integer> list = new ArrayList<>();
ArrayList<Integer> aList;
LinkedList<Integer> lList = new LinkedList<>();
Мы можем сделать это без проблем (хотя опасно в целом) ...
// Dangerous but OK with a cast
// list might not be an ArrayList
aList = (ArrayList<Integer>) list;
// Use ArrayList methods
aList.trimToSize();
list = lList;
LinkedList<Integer> danger = (LinkedList<Integer>) list;
... но это также можно сделать:
aList = (ArrayList<Integer) list;
// Use ArrayList methods
aList.trimToSize();
// list = lList;
LinkedList<Integer> danger = (LinkedList<Integer>) list;
Последние snippet приводит к ClassCastException
, потому что list
не является LinkedList
.
Кастинг выходит за пределы этого, хотя. Подумайте, когда у вас есть два целых числа, которые вы хотите разделить. Без трансляции вы можете получить целочисленный результат, когда более подходящей является плавающая точка. Рассмотрим:
int i = 2;
int j = 3;
System.out.println("No cast: " + i/j + " ;With cast: " + (double)i/j);
Выход:
Нет ролях: 0; С броском: 0,6666666666666666
Таким образом, это не зависит от случая использования.
Какой выход вы имеете в виду? – xenteros