JavaRush /Java блог /Архив info.javarush /Расширение/сужение ссылочных типов: разные источники - ра...
Core
35 уровень
Екатеринбург

Расширение/сужение ссылочных типов: разные источники - разная интерпретация

Статья из группы Архив info.javarush
Добрый день. Есть подозрение на ошибку в лекциях JavaRush. Пусть есть класс Parent и унаследованный от него класс Child Пусть есть следующие строки кода: Parent parent = new Child; Child child = (Child) parent; Согласно лекции курса level 12, lesson 1 (1. Полиморфизм и переопределение), пункту 5) (Приведение типов.) первая строка - это сужение, а вторая расширение(в лекции Сow - родитель, Whale - наследник) Но ведь это неверно. Все с точностью наоборот. Смысл описанного понятен: в первой строке мы создали объект типа Child и ограничили его использование только методами, описанными в классе Parent. Но ведь это расширение поэтому такое приведение и происходит неявно. И в дополнительных материалах уровня 10 это было сказано:Your text to link...
Расширение означает переход от более конкретного типа к менее конкретному, т.е. переход от детей к родителям. В нашем примере преобразование от любого наследника ( Child, Child2 ) к родителю ( Parent ) есть расширение, переход к более общему типу. Подобно случаю с примитивными типами, этот переход производится самой JVM при необходимости и незаметен для разработчика, то есть не требует никаких дополнительных усилий, так как он всегда проходит успешно: всегда можно обращаться к объекту, порожденному от наследника, по типу его родителя. Parent p1=new Child(); Parent p2=new Child2(); В обеих строках переменным типа Parent присваивается значение другого типа, а значит, происходит преобразование. Поскольку это расширение, оно производится автоматически и всегда успешно.
Вторая строка моего примера, напротив, согласно этим же доп. материалам является сужением что требует явного указания типа в скобках. А в лекции она интерпретируется как расширение, что наверное неправильно Поясните, пожалуйста. Не хочу иметь двойное противоречивое представление о приведении типов. Ниже представлен фрагмент лекции фрагмент лекции Были еще подозрения на ошибки в лекциях (предыдущих) Куда об этом писать? В FAQ'е не нашел.
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vitaly Khan Уровень 40 Master
21 ноября 2018
я тоже долго ломал голову, как правильно. тут действительно с какой стороны посмотреть.... субъективное восприятие понятий расширение и сужение. пожалуй, лучше всего принять за истину терминологию Оракл: https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.5 тогда получается Parent parent = new Child(); - это расширение / апкастинг - всегда безопасная операция Child child = (Child) parent; - это сужение / даункастинг - операция требует осторожности.
Nikita Zayakin Уровень 20
22 октября 2018
Можно для объектов, или иначе переменных ссылочного типа, рассмотреть терминологию восходящее и нисходящее преобразование, как например продемонстрированно тут. Это уменьшит путаницу по поводу Расширения, Сужения.
Fry Уровень 41
29 марта 2016
а что значит слово extends в java?