|
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
|
||||||||||||||||
Ограничение шаблона снизу21.08.2015, 10:39. Показов 2862. Ответов 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, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича? Определение метода-шаблона за пределами шаблона класса Редактирование шаблона сайта и шаблона письма Как создать ограничение? Надо создать ограничение ввода букв, а то программа виснет! Обтекание снизу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|