Задачу решил, но не могу понять эту запись:
public static DBObject NEO = new User().initializeIdAndName(1, "Neo");
DBObject это же интерфейс, как он может быть типом переменной??
Павел
23 уровень
Не могу понять эту запись
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
JustinianJudge в Mega City OneMaster
12 июня 2019, 22:16решение
А почему нет?
Что такое тип переменной для ссылочного типа?
Animal murzik = new Cat();
Что нам говорит эта строка?
Тип переменной определяет список доступных методов.
Сама реализация подставляется с класса который в правой части.
То есть тип переменной нам нужен фактически только как список методов, а значит интерфейс очень хорошо подходит под это определение.
interface as a type in java - Stackoverflow
Мы используем запись Cat cat = new Cat(); как самый простой тип - ведь понятно что деклариуемые и реализованные методы здесь будут совпадать.
Но чуть более сложная запись это с наследованием, но интерфейсы ведь тоже поддерживают наследование, интерфейсы имеют классы, которые их реализуют, значит можно использовать их в таком ключе.
Более того, это удобно.
Ну представь следующий пример.
Я говорю:
Это просто некая абстракция, что есть вот такой вот тип картины.
Мы приходим в художку и создаем конкретные объекты:
Удобно ведь, таким образом мы подменяем реализации под общий тип.
И с этим типом можно работать, например я хочу распечатать все овощи с картин Мишы, Андрея.
Как мне сделать цикл? Разные объекты, разного типа..
А так, есть общий тип Натюрморт, я накидаю их в список и буду итерироваться и печатся то что нужно. Если бы этого не было.
Как бы мы привели к общему знаменателю разные объекты?
new МишинНатюрлих();
new АндреяНатюрморт();
для компилятора это было бы два совершенно разных и ничем не связанных объекта, которых нельзя было бы пихать в общую корзину
+11
Павел
14 июня 2019, 18:30
Ага.. то есть переменная типа интерфейс, это что-то вроде набора методов. Посмотри пожалуйста, я правильно понял? вот продолжим пример с живописью :).
представим как-нибудь так:
Реализуем интерфейсы классе
И основная идея в том, что мы можем не создавать экземпляр класса (МишинНатюрлих и тд), а вызвать методы через переменную типа интерфейс.
Ну например:
или вот так
если я прав, тогда понял суть)
0
JustinianJudge в Mega City OneMaster
14 июня 2019, 18:54полезный
да, где-то так.
Потом станет ясней :)
+1
Wladyslaw Java Developer Master
14 июня 2019, 21:16полезный
Я сам еще до конца не понял - но для аналогии можешь глянуть ArrayList, который класс, но его можно объявить как List<E> list = new Arraylist<>(), а ведь List - это интерфейс. Удобно, вроде как таким образом реализуется полиморфизм. Но, опять же я не уверен, но где-то читал что если в классе будут методы, которых нет в интерфейсе, через такую ссылку до них не добраться
+1
Павел
15 июня 2019, 08:53
надо попробовать будет)
спасибо, коллеги!
0
Андрей Добродеев
12 июня 2019, 20:31
Немного не так.
NEO это не тип переменной, ссылочный тип. По сути это просто ссылка на объект, который может быть типа DBObject и всех его наследников.
У нас уже было так, помнишь? List<String> array = new ArrayList<>()
Здесь List является интерфейсом для ArrayList
0