java. проблемы с понимаем построения и объявления классов с generic (обобщенными) типам

У меня есть 4 класса и они зависят друг от друга.

Их заголовки:

public interface Model<Key> {
public interface DAO<Entity extends Model<Key>, Key> {
public abstract class TemplateDAO<Entity extends Model<Key>, Key> implements DAO<Entity, Key> {
public class ContainerDAO<TDAO extends TemplateDAO<Entity extends Model<Key>, Key>> {

На последнем выводи ошибку:

Desktop/lab_2/src/main/java/ru/zhenyamega/dao/СontainerDAO.java:[5,59] > expected

Desktop/lab_2/src/main/java/ru/zhenyamega/dao/СontainerDAO.java:[5,77] '{' expected

Я бы хотел узнать как правильно поступать в этих ситуациях?


Ответы (1 шт):

Автор решения: Евгений Каратаев

Алгоритм оказался таким:

В начале, там где мы объявляем имя создаваемого класса, мы объявляем все имена типов через запятую. Во всех остальных услучаях объявлять типы уже не нужно.

Данная проблема, которая у меня произошла отличный показывает это.

Пример 1:

У нас уже есть класс TemplateDAO, который имеет астрактные типы Entity и Key и Entity должен наследовать Model. И у нас получается так:

public class TemplateDAO<Entity extends Model<Key>, Key> implements DAO<Entity, Key>

но не так:

public class TemplateDAO<Entity extends Model<Key>, Key> implements DAO<Entity extends Model<Key>, Key>

нам не нужно несколько раз об этом говорить, что Entity наследует Model. Потому что инициализация происходит в начале создания класса.

Пример 2:

К нашему 1 примеру добавляется ещё одни класс ContainerDAO, к которому добавляется абстрактный тип, который наследует TemplateDAO. И вот встаёт вопрос: как с этим быть? По началу я написал так:

public class ContainerDAO<TDAO extends TemplateDAO<Entity extends Model<Key>, Key>> {}

Но он выдаёт ошибки. Решение заключалось в этом:

public class ContainerDAO<TDAO extends TemplateDAO<Entity, Key>, Entity extends Model<Key>, Key> {}

Ошибка заключалось в том, что не нужно делать объявления абстрактного типа внутри объявления другого абстрактного типа.

→ Ссылка