public static DBObject NEO = new User().initializeIdAndName(1, "Neo");
Какой тип тогда у переменной NEO? при этом код компилируется и выполняется
Andrey Tyurin
29 уровень
не понятно, почему возможна такая конструкция?
Решен
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
NodeOneExpert
16 января 2019, 10:20
тип у NEO DBObject а у User есть метод initializeIdAndName(Int i,String name) который возвращает объект класса DBObject или класса реализующего интерфейс DBObject
0
Andrey Tyurin
16 января 2019, 10:23
Правильно понял, что:
1) Типом переменной может быть интерфейс?
2) в переменной типа интерфейс может храниться ссылка на объект, класс которого реализует данный интерфейс?
Если 1 и 2 верно, то вопрос зачем объявлять переменные типа интерфейс (есть ли в этом какой-то смысл, например, в контексте разработки больших программных комплексов несколькими командами), не проще ли типом переменной всегда устанавливать класс?
0
NodeOneExpert
16 января 2019, 10:45
Да, по моему, 1 и 2 верно. По поводу вопроса, интерфейс задается для того, что бы была возможность использовать объекты разных классов, как правило загружаемых из сторонних источников, из файла или из сети. При заработке приложения информации о классе у разработчика может не быть а вот требования к реализуемому интерфейсу есть. Их разработчик и задает обозначая тип переменной.
0
hidden #598481
15 января 2019, 15:53
Смотри на примере из жизни.
Возьмем игрушки. Игрушка - это интерфейс: то, с чем можно играть. Игрушки могут быть машинками, куклами, могут быть компьютерными, и т.д, всегда какие-то, их всех объединяет возможность поиграть (наличие метода play()). В Java обычно принято называть интерфейсы на ~able, Playable например, Играемое было бы более точным переводом, но звучит кривовато. Впрочем, выбирай сам, я остановлюсь на "Игрушке".
Ты пошел и купил новую игрушку. Ты не можешь купить просто игрушку, ты мог купить что-то конкретное, например куклу. Таким образом создается новый объект:
Здесь примерно то же самое, только несколько сложнее, у тебя нет напрямую класса куклы, но есть метод который возвращает куклу, примерно так:
Учитывая, что кукла реализует интерфейс игрушек, ты можешь экземпляр объекта кукла поместить в переменную типа игрушка.
Аналогично, поскольку User реализует интерфейс DBObject, ты можешь экземпляр объекта User поместить в переменную типа DBObject.
Кстати, то же самое ты используешь, когда List<T> list = new ArrayList<>();
т.к. List тоже является интерфейсом.
У интерфейсов нельзя создавать только объекты (объекты создаются словом new):
new List<T>();
new DBObject();
новая Игрушка(); -- все это нельзя.
+2
Andrey Tyurin
16 января 2019, 10:09
Правильно понял, что:
1) Типом переменной может быть интерфейс?
2) в переменной типа интерфейс может храниться ссылка на объект, класс которого реализует данный интерфейс?
Если 1 и 2 верно, то вопрос зачем объявлять переменные типа интерфейс (есть ли в этом какой-то смысл, например, в контексте разработки больших программных комплексов несколькими командами), не проще ли типом переменной всегда устанавливать класс?
0
hidden #598481
16 января 2019, 10:58
Правильно.
Наоборот, пользуясь переменной типа интерфейс, ты имеешь больше возможностей.
Допустим, у тебя есть переменная List, ссылающаяся на ArrayList, и в определенный момент нужно сохранить в нее LinkedList. Ты спокойно можешь это сделать, поскольку оба класса реализуют List. Если бы переменная изначально была ArrayList, ты не смог бы этого сделать. Поэтому переменные как правило объявляют интерфейсом.
0
Andrey Tyurin
16 января 2019, 13:43
Замечу, что можно всегда объявлять переменную классом-родителя. В твоем примере можно использовать AbstractList. Но, как я подозреваю, можно создать свой класс с интерфейсом List, который не является наследником AbstractList, и типа чтобы можно было не парится в части классов (длинной цепочки наследования) объявлять переменные типа интерфейсов и уже их использовать для работы со своим классом...
0
Andrey Tyurin
15 января 2019, 15:28
public static DBObject NEO - какой тип у NEO? DBObject - это же интерфейс
0
Sergey MorozExpert
15 января 2019, 15:21
А что здесь невозможного и почему бы код не компилировался?
0