У меня есть в основном два типа каждого объекта в моем проекте, которые различаются только путем указания типа родительского каталога в объявлении generics класса. Каталоги сами объявляются с помощью дженериков, поскольку они могут иметь ссылки на определенный старый каталог того же типа.Условное объявление обобщений в огромной иерархии классов Java
abstract class AbstractCatalog<T extends AbstractCatalog<T>> {
public abstract T getOld();
}
class Catalog1 extends AbstractCatalog<Catalog1> {
@Override
public Catalog1 getOld() { ... }
}
class Catalog2 extends AbstractCatalog<Catalog2> {
@Override
public Catalog2 getOld() { ... }
}
До сих пор так хорошо, но проблема в том, что она становится очень громоздкой, если добавить некоторые объекты, которые должны содержать ссылку на каталог определенного типа.
Например,
abstract class AbstractCatalogHistory<C extends AbstractCatalog<C>, E extends AbstractHistoryEntry<C, E>> {
public abstract Set<E> getEntries();
}
abstract class AbstractHistoryEntry<C extends AbstractCatalog<C>, E AbstractHistoryEntry<C, E>> {
public abstract E getPrior();
}
class Cat1HistoryEntry extends AbstractHistoryEntry<Catalog1, Cat1HistoryEntry> {
@Override
public Cat1HistoryEntry getPrior() { ... }
}
class Cat2HistoryEntry extends AbstractHistoryEntry<Catalog2, Cat2HistoryEntry> {
@Override
public Cat2HistoryEntry getPrior() { ... }
}
class Catalog1History extends AbstractCatalogHistory<Catalog1, Cat1HistoryEntry> {
@Override
public Set<Cat1HistoryEntry> getEntries() { ... }
}
class Catalog2History extends AbstractCatalogHistory<Catalog2, Cat2HistoryEntry> {
@Override
public Set<Cat2HistoryEntry> getEntries() { ... }
}
поэтому он получает гораздо более трудно получить представление о том, что происходит, глядя на такой иерархии. Этот пример ни в коем случае не является полным, и у меня есть десятки типов, которые должны быть вложены в те, которые были выше.
То, что я пытаюсь сделать, это использовать безопасный код типа, который можно проверить во время компиляции. Но в то же время такой код становится совершенно беспорядочным, поскольку я должен указать более длинные цепочки генериков при добавлении новых типов в иерархию.
Есть ли способ справиться с таким дженериком?
Medo42, спасибо! Единственное, что я не могу понять, - как реализовать сеттеры в безопасном типе. –