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> {}
Ошибка заключалось в том, что не нужно делать объявления абстрактного типа внутри объявления другого абстрактного типа.