Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105

Наследование параметризированных методов в интерфейсах(о2)

24.10.2014, 03:54. Показов 2847. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Решил заняться чем-то полезным пострадать фигней и немного поиграться с интерфейсами и параметризацией.
При попытке унаследоваться от обобщённого метода в базовом интерфейсе новым интерфейсом(более конкретным), возникает ошибка в строчке с аннотацией @Override.

DAO.java
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import com.company.test.backend.model.entities.Entity;
 
import java.sql.SQLException;
import java.util.List;
 
public interface DAO<T extends Entity> {
 
    public void add(T object) throws SQLException;
 
    public void update(T object) throws SQLException;
 
    public void delete(T object) throws SQLException;
 
    public List<T> getAll() throws SQLException;
 
    public <ID_TYPE> T getById(ID_TYPE id) throws SQLException;
}


AnswerDAO.java (подвид)
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.company.test.backend.model.entities.AnswersEntity;
 
import java.sql.SQLException;
import java.util.List;
 
public interface AnswerDAO extends DAO<AnswersEntity> {
 
    @Override
    public void add(AnswersEntity answer) throws SQLException;
 
    @Override
    public void update(AnswersEntity answer) throws SQLException;
 
    @Override
    public void delete(AnswersEntity answer) throws SQLException;
 
    @Override
    public List<AnswersEntity> getAll() throws SQLException;
 
    @Override
    public AnswersEntity getById(int id) throws SQLException;
 
    public List<AnswersEntity> getAnswersByQuestionId(int questionId) throws SQLException;
 
    public List<AnswersEntity> getAnswersByTests(int testId) throws SQLException;
 
}


Ошибка в 20 строчке в AnswerDAO.java.

Собственно вопрос: можно ли вообще так делать?
И если да, то как?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2014, 03:54
Ответы с готовыми решениями:

Объявление методов в интерфейсах
Добрый вечер! Требуется в интерфейсе создать метод, чтобы после реализации этого интерфейса неким классом на вход метода в качестве...

Наследование методов
Можно ли как то классу наследнику запретить наследовать какой то из методов или полей супер класса?

Наследование классов и переопределение методов из JDK
Чтобы грамотно переопределять методы нужно читать исходники или в доках есть достаточное количество информации? Если есть то можете...

20
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.10.2014, 08:51
Andrey96, У вас какая-то странная сигнатура метода getById в базовом классе. Наверняка тип возвращаемого значения там должен быть T
Ругается потому что в базовом классе, вы указали что метод имеет один обобщенный параметр-тип, а в наследнике этого параметра нет.
1
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
24.10.2014, 19:54  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
тип возвращаемого значения там должен быть T
1. public interface DAO<T extends Entity>{...}
2. public interface AnswerDAO extends DAO<AnswersEntity> {...}
3.
Цитата Сообщение от turbanoff Посмотреть сообщение
тип возвращаемого значения там должен быть T
:
AnswersEntity является наследником Entity
Там всё правильно.

Идея заключалась в том, что id в БД может быть разных типов, и базовый интерфейс должен принимать в качестве аргумента обобщённый параметр, а его наследники(в данном случае AnswersEntity) должны указать точный параметр для этого метода.

P.S. м.б. если унаследуется новый тип от этого подвида(AnswersEntity), мы все равно не сможем изменить тип параметра, но это не решает данную проблему.

Как-то так.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.10.2014, 20:01
Andrey96, во-первых: int не может использоваться как параметр для generic-а.
Во-вторых, в вашем случае нужно этот параметр <ID_TYPE> сделать параметром типа, а не метода.
1
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
24.10.2014, 20:06  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
int не может использоваться как параметр для generic-а
Я пытался сделать Integer.
Цитата Сообщение от turbanoff Посмотреть сообщение
параметр <ID_TYPE> сделать параметром типа, а не метода
Приведите пример пожалуйста
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.10.2014, 20:27
Лучший ответ Сообщение было отмечено Andrey96 как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
public interface DAO<T extends Entity, ID_TYPE> {
 
    public void add(T object) throws SQLException;
 
    public void update(T object) throws SQLException;
 
    public void delete(T object) throws SQLException;
 
    public List<T> getAll() throws SQLException;
 
    public T getById(ID_TYPE id) throws SQLException;
}
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
24.10.2014, 20:30
Java
1
2
3
4
    @Override
    public <Long> AnswersEntity getById(Long id) {
        ...
    }
или как-то так
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.10.2014, 20:33
KuKu, Инетерсно, как вы себе представляете реализацию метода в вашем случае?
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
24.10.2014, 20:38
Хотя бы так:
Java
1
2
3
public interface Hz<T> {
    <I> T getById(I i);
}
Java
1
2
3
4
    @Override
    public <Long> AnswersEntity getById(Long id) {
        return new AnswersEntity(id);
    }
а что-то не так?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.10.2014, 20:53
KuKu, AnswersEntity тоже предлагаете делать generic-ом?
0
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
24.10.2014, 20:54  [ТС]
А нельзя ли не обобщать вновь?
Это же никак не решает проблему.
Вить я не хочу продолжать данную иерархию с обобщённым методом: зачем мне это, если мне известен тип?
Тогда я бы просто не переопределял данный метод в производном от DAO интерфейсе.

И хватит офтопить пожалуйста, то, как я буду это реализовывать никому не интересно, и не относится к данному вопросу.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.10.2014, 20:59
Цитата Сообщение от Andrey96 Посмотреть сообщение
А нельзя ли не обобщать вновь?
Это вы должны решить. Попробуйте сначала не обобщать. Если потом увидите, что получается много дублирования кода - всегда можно переделать.

Не по теме:

Цитата Сообщение от Andrey96 Посмотреть сообщение
Вить
Причем здесь Виктор?

0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
24.10.2014, 22:40
Цитата Сообщение от turbanoff Посмотреть сообщение
KuKu, AnswersEntity тоже предлагаете делать generic-ом?
Не понял в чем проблема. Чем отличается от вашего интерфейса? Только тем, что конкретный тип не во всем классе, а только в том методе, котором он нужен.
0
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
25.10.2014, 00:18  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Это вы должны решить.
Так я решил не обобщать.Проблема изначально заключалась в том, что у меня не получилось это сделать.
И на это никто так и не ответил нормально.
Простите, но обобщить метод дальше в AnswersDAO я могу, но мне нужно сделать так, чтобы потомок-реализатор AnswerDAO видел, что ему нужно реализовать именно метод
public AnswersEntity getById(int id) throws SQLException;
и соответственно для другой сущности:
public UsersEntity getById(String login) throws SQLException;
(В обоих строчках ошибка, при @Override)

Добавлено через 1 час 5 минут
Цитата Сообщение от turbanoff Посмотреть сообщение
public interface DAO<T extends Entity, ID_TYPE>
Ну наконец то, я понял о чем вы, дальше продолжать не стоит.
Спасибо вам за помощь. Удачи

Итоговый код:
DAO.java
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import com.company.test.backend.model.entities.Entity;
 
import java.sql.SQLException;
import java.util.List;
 
public interface DAO<T extends Entity, ID_TYPE> {
 
    public void add(T object) throws SQLException;
 
    public void update(T object) throws SQLException;
 
    public void delete(T object) throws SQLException;
 
    public List<T> getAll() throws SQLException;
 
    public T getById(ID_TYPE id) throws SQLException;
 
}


AnswerDAO.java
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.company.test.backend.model.entities.AnswersEntity;
 
import java.sql.SQLException;
import java.util.List;
 
public interface AnswerDAO extends DAO<AnswersEntity, Integer> {
 
    @Override
    public void add(AnswersEntity answer) throws SQLException;
 
    @Override
    public void update(AnswersEntity answer) throws SQLException;
 
    @Override
    public void delete(AnswersEntity answer) throws SQLException;
 
    @Override
    public List<AnswersEntity> getAll() throws SQLException;
 
    @Override
    public AnswersEntity getById(Integer id) throws SQLException;
 
    public List<AnswersEntity> getAnswersByQuestionId(int questionId) throws SQLException;
 
    public List<AnswersEntity> getAnswersByTests(int testId) throws SQLException;
 
}


Добавлено через 2 минуты
Дальше оффтоп:
Как вам код?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
25.10.2014, 00:33
Так себе решение. Вы изобретаете велосипед.
0
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
25.10.2014, 02:41  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Так себе решение. Вы изобретаете велосипед.
А есть какие-то готовые решения?
Если есть, то подскажите, буду их изучать/использовать, все-таки учусь же ещё.

Добавлено через 6 минут
Да и не думаю, что есть уже что-то. Максимум - связка Hibernate(то, что использую) + что-то, чего я не знаю вообще(String, Struts, Seam, JUnit, Ehcache).
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
25.10.2014, 16:36
Jpa repositories
http://docs.spring.io/spring-d... ories.html

Имеет точно такой же синтаксис что и у вас но предоставляет намного более гибкий и продвинутый механизм

Java
1
2
3
public interface UserRepository extends JpaRepository<User, Long> {
 
}
1
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
25.10.2014, 19:26  [ТС]
Я кажись упомянул Spring выше.
Да, это так, наверное, и эта технология находится 2-3 в стеке технологий/фреймворков по изучению.
Для начала хотелось бы рассмотреть Struts, чтобы потом переходить к такому большому фреймворку.
Кстати, может посоветуете какую-то "небольшую" литературу по Struts/Spring?
А ещё, чтобы сразу с Hibernate это всё было .
Был бы очень признателен.
А то книжки по Spring, которые я видел, были 700 страниц + по объему.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
25.10.2014, 21:11
Книги о программировании устаревают еще до того как выходят. Я бы на вашем месте читал гугл.
0
 Аватар для Andrey96
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 105
25.10.2014, 23:51  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Книги о программировании
Лол, так не обязательно же книги.
Я писал "литературу", а литература - не только книги.
Может статьи какие-то и т.п., кроме официальной документации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2014, 23:51
Помогаю со студенческими работами здесь

Сравнение параметризированных типов
Всем привет! У меня есть параметризированный класс, в котором есть метод, принимающий на вход две переменные с неизвестным типом. Я...

Наследование методов C++
Подскажите, если у меня есть класс, в нём описан метод добавления элемента add_element(int number); который в свою очередь основан на...

Наследование методов
Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот: Есть у нас древо классов: base &gt; s2 &gt; s3 &gt;...

Наследование и перегрузка методов
Здравствуйте. Пытаюсь выполнить упр. 8 из главы 11 книги Р.Лафоре &quot;ООП в С++&quot;, соорудил такое древо классов (картинка в конце поста). Если...

Наследование. Перекрытие методов
Нужно создать класс TFigure. В этом классе определить абстрактный метод sq – расчет площади фигуры и конструктор, который задает цвет и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru