Анонимность иногда так приятна!

  • 26
  • Недоступна
1. В пакете vo создайте public классы User, Location, Server, Subject, Subscription, которые наследуются от NamedItem 2. В классе Solution для каждого класса создайте свой метод, который возвращает список экземпляров класса. Например, для класса User это будет - public List<User> getUsers() Для клас
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (165)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Белич Максим Работает в BelEnergo ❤
30 июля, 06:31
Почему-то все пишут про то, аля как можно допереть до .execute() после закрывающей фигурной скобки.. А из уроков алишева и из лекции было понятно, что закрывающая скобка } это и есть конец переменной. Как-то интуитивно догадался. Даже не разбирая кода из части рефлексии в классе AbstractDbSelectExecutor. Кто-то когда-то в комментариях оставлял видео про рефлексию. Достаточно было один раз посмотреть, чтобы в коде когда увидишь понять, что тут примерно происходит.
Саня
Уровень 30, Москва
25 июля, 06:51
Сейчас объясню, насколько сам понял, что происходит тут:
private T getNewInstanceOfGenericType() throws InstantiationException, IllegalAccessException {
        return (T) ((Class) ((ParameterizedType) this.getClass().
                getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
}
Саня
Уровень 30, Москва
25 июля, 06:51
1. Проблематика Абстрактный класс AbstractDbSelectExecutor<T extends NamedItem> содержит метод getNewInstanceOfGenericType(), назначение которого создать новый объект класса, которым параметризован AbstractDbSelectExecutor<T extends NamedItem>. То есть, этот метод должен возвращать новые объекты того класса, чему равно в каждом конкретном случае T: User, Server, и.т.д. (так что, удачнее было бы назвать метод getNewInstanceOfParameterType) Внутри этого метода нельзя написать
return new T();
Дженерики в Java так устроены, что все эти T стираются из кода при компиляции (см. type erasure). Один из подходов, позволяющий обойти это ограничение, реализован в getNewInstanceOfGenericType(). В нём используется то, что параметризованный класс-родитель хранит информацию о конкретном типе параметра.
Саня
Уровень 30, Москва
25 июля, 06:57
2. Разбор кода this.getClass() -- при выполнении кода будет вызван getNewInstanceOfGenericType() у класса - наследника AbstractDbSelectExecutor (как раз, эти анонимные наследники и требуется написать в задаче). Так вот, this ссылается на такого наследника, а getClass() возвращает его класс. (ParameterizedType) this.getClass().getGenericSuperclass() -- это ссылка на класс-родитель анонимного класса this.getClass(), который параметризован одним из классов User, Server, и т.д.. ( то есть, это сслка на AbstractDbSelectExecutor<User>, или AbstractDbSelectExecutor<Server> и т.п.) getActualTypeArguments()[0] -- "экстрагирует" тип-параметр, например для AbstractDbSelectExecutor<User> это будет User ((Class) ((ParameterizedType) this.getClass(). getGenericSuperclass()).getActualTypeArguments()[0]).newInstance() создаёт то что требуется от метода -- новый обект User, Server и.т.п.
Саня
Уровень 30, Москва
25 июля, 07:49
3. Что осталось непонятно Почему AbstractDbSelectExecutor хранит информацию о типе-параметре? Получается, для каждого анонимного класса будет создан свой AbstractDbSelectExecutor, в одном случае AbstractDbSelectExecutor<User>, в другом AbstractDbSelectExecutor<Server>, и.т.д.?
Artur Latypov
Уровень 35, Санкт-Петербург
8 июля, 15:07
private T getNewInstanceOfGenericType() throws InstantiationException, IllegalAccessException { return (T) ((Class) ((ParameterizedType) this.getClass(). getGenericSuperclass()).getActualTypeArguments()[0]).newInstance(); } Кто-нибудь, обьясните эту строчку, особенно, на что ссылается у нас this перед getClasses
Максим Дудин
Уровень 30, Калининград
2 июня, 16:23
Как всегда самое сложное понять, ЧТО от тебя требуется: раз класс абстрактный (т.е. "чертёж" по которому нужно строить наследуемые от него классы, как нам раньше объясняли), то анонимный от него должен: а) переопределять абстрактные методы б) вызывать "обычные" т.е. реализованные в самом абстрактном классе я так понимаю... 1. при переопределение getQuery() он должен возвращать строку (что понятно из названия) в которой должно быть SELECT * FROM LOCATION в случае с getLocations(), SELECT * FROM USER в случае с getUsers() и т.д. как бы просматривается некоторая взаимосвязь - которую я сразу не увидел( а в эталонном решении немного по другому, так правильней?) 2. А вызов "обычного" должен быть через точку после объекта анонимного класса (ни за что сам бы не допёр) new Анонимный класс(){ код }.execute(); P.S. У абстрактного класса объектов быть не может, а у анонимного даже если он от абстрактного может... кто знал?
Ринат
Уровень 28, Казань
30 мая, 09:37
Задача нормуль, не сложная, если делать по рецепту условия. Но 2 раза переписывал из за того, что в методах вместо Servers писал Server) Про execute() для общего развития тут.
Dmitry Technical Lead
2 июня, 09:02
аналогично, вместо getServers() был getServer() и т.п.
Waumok Работает в аду
7 июня, 06:06
+
Евгений (FatJohny)
Уровень 41, Калуга, Россия
17 мая, 20:29
Подтверждаю, валидатор кушает getQuery c null.
vzubkeviсh
Уровень 25, Санкт-Петербург, Россия
15 мая, 06:53
боже, зачем класс AbstractDbSelectExecutor  был имплеменитрован от Usera, никак понять не мог почему всё подчеркнуто красным
Сэм Фишер
Уровень 27, Кишинев, Молдова
13 мая, 07:46
хорошая задача, но не совсем понятная. вот я в анонимном классе переопределил getQuery(), потом вызвал execute() у объекта анонимного класса и в теле его метода вызвался переопределенный getQuery... каким образом наш абстрактный класс узнал об этом переопределении при выполнении execute()?
Roman Grand
Уровень 35, Новосибирск, Россия
12 мая, 19:57
с 1ой попытки, НО осталось чувство: "Как же мне хочется никогда не заниматься подобным на грядущих реальных проектах..."
Сэм Фишер
Уровень 27, Кишинев, Молдова
13 мая, 07:45
вряд ли такого будет много. мне думается, что анонимные классы больше используются для лямбд
Maks Panteleev
Уровень 41, Москва, Россия
12 мая, 08:53
Мало че понял, но решил практически правильно)) единственное что - не совсем разобрался с синтаксисом анонимных классов и не знал, что метод .execute(); надо вызывать именно таким образом через точку от кода анонимного класса, вызывал без точки, в теле