Задачу решил. Но все равно осталось некоторое непонимание. Помогите понять что происходит.
В условии написано:
3. Метод getProxy должен возвращать прокси для любого интерфейса, который наследуется от Item.
интерфейс Small который мы передаем в массиве интерфейсов не относится к Item, и как это тогда работает, ведь возвращает инстанс Small, а возвращаемый параметр (T extends Item) и вроде Small сюда не относится. Помогите пожалуйста понять этот момент. Заранее благодарю.
Александр один Эс
41 уровень
Задачу решил. Но все равно осталось некоторое непонимание. Помогите понять что происходит
Решен
Комментарии (20)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
8 ноября 2020, 09:24
getProxy должен иметь два параметра.
Первый - класс возвращаемого типа, второй - классы дополнительных интерфейсов
Дополнительные интерфейсы не обязаны наследоваться от Item, на их счёт в условии нет никаких ограничений.
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
8 ноября 2020, 19:53
А зачем тогда чтобы они обязательно наследовались от Item. Это просто условие такое задачи или это технический момент о котором нужно знать? Что это дает?
0
Ksenia VolkovaJava Developer в DXCMaster
8 ноября 2020, 19:59
Если я правильно помню, метод должен возвращать Item - а для этого основной интерфейс должен быть Item или его наследником.
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
8 ноября 2020, 20:27
Честно я дугадум. Вы не прояснили мне последним ответом ситуацию, появились новые вопросы :)
Вернемся к 1му Вашему ответу:
getProxy должен иметь два параметра.
Первый - класс возвращаемого типа, второй - классы дополнительных интерфейсов
А теперь к 2му Вашему ответу
метод должен возвращать Item - а для этого ОСНОВНОЙ ИНТЕРФЕЙС должен быть Item или его наследником.
А теперь вопрос: 1 аргумент, мы определяем возвращаемый тип, в нашем случае по условию задачи Item, 2 аргумент массив интерфейсов, Вы их назвали в ответе (классы дополнительных интерфейсов). Что значит ОСНОВНОЙ ИНТЕРФЕЙС, почему он должен быть, а другие могут не быть, он передается во втором аргументе ?
0
Ksenia VolkovaJava Developer в DXCMaster
8 ноября 2020, 21:08
Да я в своих ответах в основном цитирую само задание )
И сделаю это еще раз
2) getProxy должен иметь два параметра. Первый - класс возвращаемого типа, второй - классы дополнительных интерфейсов (используй аргумент переменной длины ...).
Первый параметр - класс возвращаемого типа. И по условию задачи это должен быть Item или его наследник.
Второй параметр - это множество дополнительных интерфейсов, которые могут быть любыми.
Наш прокси в любом случае будет реализовывать все эти интерфейсы, но по крайней мере один из них должен наследоваться от Item - поэтому он отделен от остальных, для него есть ограничение по типу.
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 04:46
А насколько вообще ситуация является нормальной (не только в рамках этой задачи) когда мы в прокси (а может даже и не в прокси) возвращаем тип Item но интерфейс вообще никак не Item и мы его принудительно можно сказать к нему приводим (сразу упустим про примитивы, а вопрос касается собственных объектов не примитивов). Что мы получим в итоге? По мне видится что это немного бред. Как машину запихнуть в самолет, или как в розетку на 380 вставить вилку от прибора на 220. Если это нормально можешь примеры из жизни привести чтобы мог сам иметь представление. Спасибо большое Ксения.
0
Ksenia VolkovaJava Developer в DXCMaster
9 ноября 2020, 06:11
А где ты такое видишь - в этой задаче или за ее рамками - чтобы возвращали тип Item но интерфейс вообще никак не Item?
Возвращается объект, который Item плюс ещё какие-то интерфейсы. От этого он не перестает быть Item.
Тебя же, наверно, не смущает запись
при том что
+2
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 08:32
С листом все понятно, не понятно в задаче
В задаче 3 интерфейса:
1. Item;
2. Big он extends Item; (тут все понятно);
3. Small он сам по себе НЕ РЕАЛИЗУЕТ Item (посмотри по коду). Вот тут мне и не понятно.(
А прокси возвращает тип который Item или его наследник. Small же не подходит под это, но тем не менее он его возвращает и принудительно приводит к Item (т.к он указан как тип в 1м аргументе, который отвечает за тип возвращаемого значения).
Я тут что-то не понимаю какой-то пазл в голове не сходится.
0
Ksenia VolkovaJava Developer в DXCMaster
9 ноября 2020, 08:48
Так тут то же самое, что и с листом.
Deque не является наследником List, но LinkedList от этого не перестает быть List.
Так и здесь - твой прокси возвращает объект, который одновременно Item, Big и Small. От того, что Small не является наследником Item, этот объект не переcтает быть Item.
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 10:41
Не совсем верное сравнение.
Ведь LinkedList наследник List а тот в свою очередь Collection
тоже и к Deque наследник Collection что и List
а в задаче Small не наследник Item, он нечего никого наследник
У меня меня сейчас такой в голове конфликт выходит
Давай по другому представим:
У меня есть 1 интерфейс Car
Есть 2й интерфейс BMW наследующий Car
У меня есть 3й интерфейс Dog (Собака)
И все это я помещаю в массив интерфейсов в прокси, а возвращаю объект с типом Car
Как Dog (Собака) может быть Car? Как это будет работать? Как это вообще можно преобразовать
0
Wladyslaw Java Developer Master
9 ноября 2020, 10:45
А как насчет Cloneable, Serializable ?
Они тоже особняком стоят
0
Ksenia VolkovaJava Developer в DXCMaster
9 ноября 2020, 10:52
Помнишь, была задача про утку Duck, которая имплементит CanFly и CanSwim?
Это два совершенно не связанных интерфейса, но тем не менее если
то
и то, и другое будет верно.
В твоем случае, если твой объект реализует интерфейсы Dog и Car, значит ты видимо создаешь какую-то автособаку. Во всяком случае - объект, который имеет поведение как собаки, так и машины.
Например, если
то значит твоя автособака умеет и лаять, и ездить.
Например, если
то значит твоя автособака умеет и лаять, и ездить. +3
hidden #2322530
9 ноября 2020, 10:59
как раз в тему
![]()

0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 11:12
Так хочется в живую).
Спасибо огромное, пример про автособаку )))) супер и я наконец похоже понял на этом примере.
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 11:12
Cloneable, Serializable - это интерфейсы маркеры, немного как мне кажется не верный пример
0
Wladyslaw Java Developer Master
9 ноября 2020, 11:15
Оно, конечно смысла особого не имеет, но так вот сделать можно, напрмер.
Я только об этом.
Реализуемые интерфейсы не обязательно логически связанны друг с другом.
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 11:31
Снова мне кажется мимо :)
Cloneable cloneable = new LinkedList<>(); - Unreachable statement
Попробуй в среде такое напиши.
0
Wladyslaw Java Developer Master
9 ноября 2020, 11:33
1791741888
1595428806
Unreachable statement это немного о другом, смотри где там у тебя выше по коду ретурны или что-то такое. :)
0
Александр один ЭсBackend Developer в EFFECTIVESOFT POLAND
9 ноября 2020, 12:56
Пардон, да действительно написал строку для проверки в первом попавшемся методе открытого класса после return Cloneable cloneable = new LinkedList<>();
Но опять же фраза твоя: "Реализуемые интерфейсы не обязательно логически связанны друг с другом." и это пример не совсем не логичен.
Ведь LinkedList реализует интерфейс Cloneable это маркер позволяющий клонировать поэтому логика тут есть.
Все БОЛЬШОЕ спасибо. Вопрос закрыт. Надеюсь другим как я поможет понять так же.
0
Vadimayer
13 ноября 2021, 14:14
Ксения, ты лучшая, вот это я понимаю без документации объяснила, так объяснила!)
0