Каким образом работает явное приведение типов то есть например:
List coll = new ArrayList();
List coll2 = (LinkedList) coll;
Явное приведение типа ArrayList к типу LinkedList как это происходит? Ясно что List является общим интерфейсом для обоих поэтому ссылка может содержать объект типа ArrayList или LinkedList или какую нибудь другую собственную реализацию...
Объясните пожалуйста каким образом происходит приведение типа ведь объект создается в куче и как потом меняется его тип?
Ответ
Такое приведение типов не сработает и будет выброшено исключение. ArrayList нельзя привести к типу LinkedList. Смотрите дерево подчиненности.
Касательно самой операции приведения типов (или cast'а) - исходный объект - тип не меняет, просто меняется ссылка на него.
P.S. Подтекст вопроса в том, что якобы ваш col1 имеет тип List, а раз он имеет тип List то можно провести кастинг на LinkedList, который также имеет интерфейс List. Хитрый у вас интервьюер :)
Update
Правила кастинга такие:
Downcasting - нисходящее приведение, то есть приведение от предка к потомку предку подтипу возможно если только исходная переменная является подтипом приводимого типа. Ошибка может возникать runtime или на этапе компиляции. Скажем:
Object object;
String s=(String )object; //разрешено, поскольку тип переменной object
//может быть String'ом, но это выяснится только в runtime
Double object=new Double(1.0);
String s=(String )object; //ошибка будет на этапе компиляции поскольку тип
// object известен компилятору и он не приводим к типу String
Object object=new Double(1.0);
Number n=(Number )object; //разрешено, поскольку Double
// является подтипом Number
Upcasting - восходящее приведение типов или приведение типов от потомка к предку, разрешено всегда.
Запрещено приведение типов не "лежащих" в одной иерархии (как в случае Double и String или LinkedList и ArrayList)
Комментариев нет:
Отправить комментарий