|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||||||||||||||||
Ограничение шаблона снизу21.08.2015, 10:39. Показов 2828. Ответов 13
Метки нет (Все метки)
Разбираю пример по учебнику, там говорится, что я могу ограничить шаблон снизу вот так: <? super подклассы>
Пробую в Eclipse-не получается вот что: Есть метод
0
|
||||||||||||||||
| 21.08.2015, 10:39 | |
|
Ответы с готовыми решениями:
13
ListBox, ограничение списка элементов с помощью шаблона
|
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
||
| 21.08.2015, 12:44 | ||
|
Поэтому тут выбирается наименьший общий предок до FourD, которым является Object. Классы-потомки FourD не подходят. Выражение <? extends ThreeD> означает, что годится любой потомок (расширение) начиная с класса ThreeD. Поэтому тут выбирается наименьший общий предок, которым является ThreeD. Классы-предки ThreeD не подходят.
1
|
||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||
| 21.08.2015, 14:02 [ТС] | ||
|
EVP, это всё понятно, только
0
|
||
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|||||||||||||
| 21.08.2015, 15:00 | |||||||||||||
|
Подстановка <? super FourD> говорит, что можно подставить любого предка. Элементы контейнера могут быть любым предком. Наименьшим безопасным предком любых элементов такой подстановки в контейнере будет Object. При такой подстановке, лишь класс FourD и его потомки могут быть безопасно присвоены контейнеру с любым неизвестным предком. Поэтому для контейнера с подстановкой <? super FourD> тип элемента контейнера будет Object, а присваивать элементу контейнера можно объекты класса FourD и любого потомка.
А у класса Object нет поля z.
2
|
|||||||||||||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 22.08.2015, 16:52 [ТС] | |
|
EVP, а почему предка FourD- ThreeD нельзя присвоить? Только Object что ли можно? Странно как-то. Смысл тогда этого?
0
|
|
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|||
| 22.08.2015, 19:45 | |||
|
Object TwoD ThreeD FourD. При определении Coords<? super FourD> ты можешь подставить контейнеры: Coords<Object> Coords<TwoD> Coords<ThreeD> Coords<FourD>. Для таких типов контейнеров безопасным приведением при присваивании его элементам будут только элементы типа FourD и его потомков. Например, присваивание элементов типа ThreeD контейнеру типа Coords<FourD> (такая подстановка возможна) будет невозможно без приведения. Поскольку приведение ThreeD к FourD является нисходящим по иерархии и потому небезопасно. Присваивание элементов типа Object также гарантированно небезопасно.
1
|
|||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||
| 22.08.2015, 21:03 [ТС] | ||
|
EVP,возможно, я не совсем понимаю, что вы имеете ввиду, или может я чего-то не знаю..Мне остается непонятным:
0
|
||
|
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
|
|
| 22.08.2015, 21:25 | |
|
danek130995, Coords<? super FourD> с = new Coords<Object>() - например, допустимая конструкция? Подумайте. И вопросы должны пропасть
1
|
|
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
||
| 22.08.2015, 22:34 | ||
Сообщение было отмечено danek130995 как решение
Решениеопредели возможность безопасного изменения контейнера для всех возможных подстановок. Попробую обобщить: Тип Coords<? super FourD> должен работать для любого супертипа, поэтому он для компилятора схлопывается до минимального типа, которым является тип Coords<Object> (это корень иерархии). Поэтому showAll2 не видит вообще никакие поля твоих классов, а не только поле z класса ThreeD, т.к для неё тип элементов Object. Тут минимальный тип подстановки Coords<Object>. максимальный тип подстановки ограничен типом Coords<FourD>. Максимальный тип важен для определения возможности присваивания элементам. Поэтому определение Coords<? super FourD> схлопнется до минимального типа Coords<Object>. Элементам контейнера типа Coords<? super FourD> можно присваивать типы FourD и его наследники, т.к. такое присваивание будет гарантированно безопасным для максимального типа элементов подстановки (тип FourD). Т.е. c.coords[i] = new FourD(); вполне легален (т.к. максимально возможный тип подстановки Coords<FourD>), но тип c.coords[i] будет Object (это минимальный тип элементов подстановки). Если ты хочешь хочешь работать с классом FourD и его потомками, то требуется ограничение Coords<? extends FourD>. Т.к. в этом случае любые подстановки будут расширять тип FourD. Т.е. тип c.coords[i] будет FourD для компилятора. Тут минимальный тип подстановки Coords<FourD>. максимальный тип подстановки не ограничен. Поэтому определение Coords<? extends FourD> схлопнется до минимального типа Coords<FourD> без возможности безопасного присвоения вообще, т.к. ограничения по максимальному типу подстановки нет.
1
|
||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||||||
| 23.08.2015, 09:53 [ТС] | ||||||
|
Kochmarik, EVP, У меня класс объявлен вот так: public class Coords<T extends TwoD>{}
И конструкция Coords<? super FourD> с = new Coords<Object>() не допустима , EVP, я все понял, огромное спасибо! Проверьте меня: Схлопываться в первом случае будет не до Object, так у меня класс, в котором объявлены эти методы, public class Coords<T extends TwoD>. Так что поля класса x,y видимы будут, а вот поле z нет, так как ThreeD-наследник класса TwoD, а родителям не видны поля наследников, а вот наоборот-поля суперкласса видны подклассам-это верно. Просто у меня че то вылетело это из головы, вот поэтому я и не понимал, почему поле z не видно. P.S. под контейнером вы имеете ввиду объект класса? Просто я не встречал слово контейнер Добавлено через 10 минут EVP, сейчас попробовал сделать следующее:
0
|
||||||
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|||||||||
| 23.08.2015, 12:34 | |||||||||
Сообщение было отмечено danek130995 как решение
РешениеСтандартными контейнерами, например, являются: List<T>,Map<K,V>,Set<T> и другие. Твой шаблон класса Coords<T> - тоже контейнер. Но подстановка ведь определяется для шаблона, а не сама по себе. Поэтому тип Coords<? super FourD> схлопнется до Coords<Object>(с ограничениями на присваивание), предок которого Object. Поэтому тут ты опять пытаешься сделать нисходящее приведение, на что компилятор ругается. Но можно сделать такое:
1
|
|||||||||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||
| 23.08.2015, 13:42 [ТС] | ||
|
EVP, ааа, я понял-так как предок Coords<Object> опять же-Object, то я пытался сделать нисходящее присваивание(Coords<Object> является наследником Object), и получил ошибку. Я еще помню, что переменная подкласса не может ссылаться на объект суперкласса, а вот наоборот-может. Спасибо огромное, выручили!
Добавлено через 9 минут EVP, получается в книге ошибка? Там сказано, что:
0
|
||
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|||
| 23.08.2015, 14:59 | |||
1
|
|||
|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
|
| 23.08.2015, 16:17 [ТС] | |
|
EVP, понятно) Спасибо
0
|
|
| 23.08.2015, 16:17 | |
|
Помогаю со студенческими работами здесь
14
Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича? Определение метода-шаблона за пределами шаблона класса Редактирование шаблона сайта и шаблона письма Как создать ограничение? Надо создать ограничение ввода букв, а то программа виснет! Обтекание снизу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|