public static void main(String[] args) throws Exception {
SimpleObject<String> stringObject = new StringObject<Object>();
interface SimpleObject<T> {
SimpleObject<T> getInstance();
}
public static class StringObject<Object> implements SimpleObject<String>{...}
что определяет дженерик в интерфейсе? к чему в данном случае применяется тип String?
как понял, в классе дженерики определяют тип поля класса, в ArrayList - тип содержимого
как связаны Object и String в данном примере? компилируется и в таком виде
SimpleObject<String> stringObject = new StringObject<Integert>();
Den
17 уровень
Дженерики
Решен
Комментарии (19)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Женя
15 октября 2019, 08:23
Стас Пасинков (пару постов ниже) дает хорошее объяснение.
Если кому-то информации покажется недостаточно, то вот, на мой взгляд, отличная статья о том, что мы все знали, но забыли: https://metanit.com/java/tutorial/3.11.php
+7
Prosperro
29 марта 2020, 19:40
Спасибо, перечитал уже много статей про дженерики, но именно в этой нашел решение 👍
0
VDT Java Developer
31 января 2019, 07:56
" в ArrayList - тип содержимого как связаны Object и String в данном примере? "
Как боженька молвил....
0
Den
6 марта 2019, 11:21
там вообще-то перенос строки, это два предложения
+1
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 23:04
представьте такую ситуацию.
вас попросили написать интерфейс и класс с реализацией для такой задачи, чтоб можно было хранить три значения. например для RGB. где каждый объект вашего класса представлял бы собой комбинацию красного, зеленого и синего цветов. то-есть, хранил бы в себе 3 целых числа.
вы пишите что-то типа
всем все нравится, все довольны.
но на следующий день приходит тот же человек, и говорит, что они тут подумали и решили, что надо хранить не целые числа, а дробные, чтоб поточнее было
вы переписываете свой класс
на следующий день этот же человек прибегает и машет руками, и говорит, что не надо было переписывать, а надо было сделать новый, но уже для дробных. потому что тот класс с целыми они тоже используют, но еще им надо и для дробных.
вы делаете два практически одинаковых класса: TrioInts для хранения троек целых чисел, и TrioDoubles - для хранения троек дроюных.
потом приходит этот же человек и говорит что им все нравится, но теперь им надо такой же класс, но уже не для чисел, а для строк. они там игру какую-то пишут и у них там тройки лошадей запряжены, и им надо хранить имена лошадок из одной упряжки все в одном месте. ведь ты же уже делал такое для чисел, давай теперь и для строк сделай.
появляется новый класс
+116
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 23:15решение
потом снова он приходит, и говорит, что им надо теперь сохранять не только имена лошадей, но и сами эти объекты лошадок тоже. но для вывода сообщений они будут использовать тот класс с тройками строк, а этот класс им нужен чтоб просто в памяти лошадок хранить.
вы создаете новый класс (уже решаете все свои классы эти внести в один пакет, так как их реально стало очень много), импортите в это новом классе их класс с лошадьми и пишите
вас уже это начинает поднапрягать, потому что вы целую неделю все что делали - это писали (и проверяли, тестировали) одинаковые по своей сути классы. которые отличались лишь тем, с какими типами данных они работают: какие типы данных хранят, какие принимают данные в конструкторах и сеттерах, какие типы данных возвращают в геттерах. но вся логика - абсолютно одинакова.
снова приходит этот человек, и говорит, что им так нравятся ваши классы, и что теперь им надо хранить в первом поле число, во втором - строку, а в третьем - список лошадей.
тут у вас терпение заканчивается и вы вспоминаете про свои знания дженериков, удаляете нафиг все те классы и заменяете их все - одним. но с использованием дженериков:
и вот теперь пользователь вашего этого класса - может сам решать с какими типами данных он хочет работать в этом вашем классе, просто указав нужный ему тип в угловых скобочках:
+298
Den
23 марта 2018, 23:49
Отличный пример, его бы и в лекции вынести
Не хватает таких практических примеров применения
+9
Стас Пасинков Software Developer в Zipy Master
24 марта 2018, 10:54
жаль только он вам не поможет решить вашу задачу)))
просто чтоб понять суть дженериков - ок, но задача у вас посложнее))
+3
Александр
11 июня 2018, 15:26
Как раз таки помог решить эту задачу) Спасибо
+2
VDT Java Developer
31 января 2019, 08:04
ОГРОМНОЕ СПАСИБО
+1
RiccioMaster
1 марта 2019, 20:19
Стас, очень круто. Спасибо большое.
+2
Северин
30 сентября 2019, 12:51
божило!!
0
Igor #2848652
8 апреля 2022, 18:38
Афигеть, спасибо💪
0
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
7 марта 2023, 11:14
Стас, спасибо! Ты - феноменальный ментор!
0
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 19:30
суть не в том, чтобы оно скомпилировалось, а чтобы работало)
тип SimpleObject будет уметь работать с другими типами данных, с теми, которые будут указаны в квадратных скобочках при создании объекта.
то-есть, сегодня вы хотите чтобы SimpleObject работал со строками - поэтому пишете
Завтра захотите чтобы он работал с котиками - поэтому пишете
потом захотите вообще чтобы он работал со списками объектов типа SimpleObject - поэтому пишете
ну а когда вы для каждой своей потребности пишете ту или иную реализацию такого интерфейса - там вы указываете либо обощенный тип (как и в интерфейсе там, <T>), ну либо какой-то конкретный уже тип, как хотят от вас в задаче :)
если из того, что я написал ничего не понятно (я бы не понял наверное, хех) - тогда просто не обращайте внимание на то, что я написал.
просто я пока не знаю как бы это так написать, чтобы вы поняли...(( +25
Den
23 марта 2018, 21:42
Спасибо за ответ
1)Вот конкретный пример
interface SimpleObject< String>
На что указывает тип String, Что именно будет типа стринг?
Может ли существовать такой вариант:
interface IName <T>{
void method1();
void method2();} ,т.е.тип Т нигде в методах не фигурирует
2) public static <String> void name(){}
Зачем обобщенный тип в данном методе?
0
Сергеев ВикторMaster
23 марта 2018, 22:04
1.да
2. Такое написание вызовет ошибку компиляции
0
Стас Пасинков Software Developer в Zipy Master
23 марта 2018, 22:47
может вам на примере будет проще разобраться?
посмотрите как выглядит интерфейс List
посмотрите как реализован ArrayList
там везде дженерики используются
а потом посмотрите как все эти методы вы используете у себя в коде
например, попробуйте ответить на ваш вопрос: "На что указывает тип String, Что именно будет типа стринг?"
+2
Сергеев ВикторMaster
23 марта 2018, 18:07
Дженерик заменяется типом, который вы укажите. В классе, методе, интерфейсе - везде. Принцип работы у него один.
что определяет дженерик в интерфейсе?
-если вы ответите что определяет дженерик в классе? и что определяет дженерик в методе? я возможно пойму о чем вы спрашиваете. Дженерик определяет неизвестный тип, но один.
как связаны Object и String в данном примере?
-никак
0