Кастинг имеет разные применения. К сожалению, в вашем примере нет полезного примера приведения, поскольку вы создаете экземпляр 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;
Последний фрагмент дает ClassCastException
, потому что list
не является LinkedList
.
Однако кастинг выходит за рамки этого. Рассмотрим, когда у вас есть два целых числа, которые вы хотите разделить. Без приведения вы могли бы получить целочисленный результат, где более уместно число с плавающей запятой. Рассмотреть возможность:
int i = 2;
int j = 3;
System.out.println("No cast: " + i/j + " ;With cast: " + (double)i/j);
Выход:
Без приведения: 0; С приведением: 0,6666666666666666
Итак, это зависит от варианта использования.
person
ChiefTwoPencils
schedule
02.09.2016