Баг в initializeIdAndName

  • 8
  • Недоступна
Что-то не так в этом коде! Ваша задача — поправить программу, чтобы она компилировалась и работала. Для начала разберитесь, что работает неправильно и вынесите реализацию метода initializeIdAndName в класс User. При этом initializeIdAndName в классе User должен возвращать тип User.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (168)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Artem Mavrych
Уровень 27, Киев, Ukraine
22 января, 11:45
Мы МОЖЕМ "менять" в перезаписанных методах тип DBObject на User потому что User - это DBObject (User is a DBObject). Помните примеры где создавался класс Animal, а потом класс Cow extends Animal ? Мы потом еще могли создавать корову так:
Cow cow = new Cow();
А могли переменной суперкласса:
Animal animal = new Cow();
Мы так можем делать потому что между Animal и Cow "is-a" связь. "Сow is an Animal" (Корова это Животное), НО ЖИВОТНОЕ НЕ ВСЕГДА КОРОВА! (Animal is NOT a Cow) т.к. Животное может быть свиньей, петухом, медведем, зайцем, педофилом, политиком, белкой и т.д. Когда в программе видите код типо:
public class Cow extends Animal
- заменяйте в уме слово "extends" на "is a" и читайте Сow is an Animal. С интерфейсами такая же штука т.к. implements это по сути тот же extends:
class User implements DBObject
Как читаем?
User is a DBObject
Что мы из этого сразу в голове себе должны разложить по полочкам? Следующее: 1) Везде, во всех методах где есть DBObject - можно вписать User (но НЕ наоборот, потому что User is a DBObject НО DBObject не всегда User (Животное - не всегда корова). Пример:
public void killAnimal( Animal a){
//Какой-то код
}
//и используя этот метод мы можем в его параметры вставить Cow
Cow cow = new Cow();
killAnimal(cow);
2) Исходя из логики пункта 1 мы так же можем писать
DBObject dbobject = new User();
и
User user = new User();
Но учтите, что при написании первого варианта вы можете использовать только те методы которые есть в интерфейсе DBObject.
Aleksei Reinsalu
Уровень 19, Таллинн, Эстония
28 декабря 2021, 10:20
Поскольку знания еще слабые пришлось себя проверять. Первоисточник подтвердил, что интерфейс это ссылочный тип. Много деталей, которые сразу все выучить трудно. Но этот тонкий нюанс все же выучил. Интерфейс может служить названием/ссылкой для объекта применяющего класса. Это объясняет почему ответ на вопрос "можно ли создавать объекты интерфейса" звучит как "напрямую нельзя, но.." а не просто "нет".
Sasha Dokuchaev Работает в Andersen
17 декабря 2021, 10:36
Сложно, но IDEA умница, помогает понять, что к чему
Neonila Kravtcova
Уровень 18, Санкт-Петербург, Россия
6 декабря 2021, 22:37
Не знала, что при реализации метода, заявленного в интерфейсе, в классе мы можем изменить тип значения, возвращаемого этим методом.
Darya Hom
Уровень 26, Москва
4 января, 19:03
Да, вот тут было, что у переопределённого метода должен быть тот же тип возвращаемого значения. Непонятно(
Artem Mavrych
Уровень 27, Киев, Ukraine
22 января, 11:44
Мы МОЖЕМ "менять" в перезаписанных методах тип DBObject на User потому что User - это DBObject (User is a DBObject). Помните примеры где создавался класс Animal, а потом класс Cow extends Animal ? Мы потом еще могли создавать корову так:
Cow cow = new Cow();
А могли переменной суперкласса:
Animal animal = new Cow();
Мы так можем делать потому что между Animal и Cow "is-a" связь. "Сow is an Animal" (Корова это Животное), НО ЖИВОТНОЕ НЕ ВСЕГДА КОРОВА! (Animal is NOT a Cow) т.к. Животное может быть свиньей, петухом, медведем, зайцем, педофилом, политиком, белкой и т.д. Когда в программе видите код типо:
public class Cow extends Animal
- заменяйте в уме слово "extends" на "is a" и читайте Сow is an Animal. С интерфейсами такая же штука т.к. implements это по сути тот же extends:
class User implements DBObject
Как читаем?
User is a DBObject
Что мы из этого сразу в голове себе должны разложить по полочкам? Следующее: 1) Везде, во всех методах где есть DBObject - можно вписать User (но НЕ наоборот, потому что User is a DBObject НО DBObject не всегда User (Животное - не всегда корова). Пример:
public void killAnimal( Animal a){
//Како-то код
}
//и используя этот метод мы можем в его параметры вставить Cow
Cow cow = new Cow();
killAnimal(cow);
2) Исходя из логики пункта 1 мы так же можем писать
DBObject dbobject = new User();
и
User user = new User();
Но учтите, что при написании первого варианта вы можете использовать только те методы которые есть в интерфейсе DBObject.
Андрей
Уровень 14, Москва, Россия
28 сентября 2021, 13:12
// Метод initializeIdAndName в классе User должен иметь тип возвращаемого значения User. // Метод initializeIdAndName должен присваивать значения полям id и name объекта типа User // в соответствии с переданными ему параметрами и возвращать этот объект. @Override public User initializeIdAndName(long id, String name) { this.id = id; this.name = name; return this; }
Ян
Уровень 16, Москва
12 декабря 2021, 06:21
А я делал так и не работало. Пока что-то запутался. User u = new User(); u.id = id; u.name = name; return u;
Максим Белоусов
Уровень 18, Москва, Россия
18 сентября 2021, 09:36
Мне кажется что вся сложность задачи в том что очевидной необходимости использования интерфейса в этой задаче нет. Можно просто создать Нео и Тринити без усложнения интерфейсами с созданием этих объектов. Задача решается легко через Idea.
13 июля 2021, 08:17
Что возвращает код
return this
Игорь
Уровень 13, Днепр, Украина
15 июля 2021, 13:31
Объект, у которого взывают метод.
Максим Белоусов
Уровень 18, Москва, Россия
18 сентября 2021, 09:14
На сколько я понял этот метод работает как конструктор у класса User. Только он не просто является шаблоном для создания объекта, но еще и возвращает его при вызове метода. Поправьте пожалуйста если я не прав.
antlantis
Уровень 25
3 июля 2021, 23:46
и еще вопрос, почему обязательно в одном файле должен быть только один класс с модификатором public ? это рекомендация? договоренность программистов или требование компилятора?
antlantis
Уровень 25
3 июля 2021, 22:30
Ребята. извините если глупый вопрос, подскажите пожалуйста, почему можно вот таким образом в данном случае возвращать объект , просто указав return this? всегда ли это правомерно? interface DBObject { DBObject initializeIdAndName(long id, String name) { this.id = id; this.name = name; return this; } }
BobaFoba
Уровень 22, Рязань
25 июня 2021, 20:03
*когда кто-то упоминает матрицу*