我的项目中基本上有两种每个实体,它们只通过在类泛型声明中指定父目录类型来区分。目录本身以泛型方式声明,因为它们可以链接到相同类型的特定旧目录。
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() { ... }
}
当查看这样的层次结构时,很难理解正在发生什么。这个例子并不完整,我有数十种类型应该嵌套在我提供的类型之内。
我尝试通过这样做来利用类型安全的代码,可以在编译时进行验证。但同时,由于我必须在层次结构中添加新类型时指定更长的泛型链,这样的代码变得非常混乱。
有没有一种方法来处理这样的泛型爆炸?