Search code examples
javagenericsself-reference

A generic signature for self referencing entity?


I defined an interface for a child entities of a specified type.

// a child of T
interface IChildEntity<T> {
    T getParent();
}

Now I'm trying to define an interface for self-referencing entities.

Which one of these definitions is preferred?

interface ISelfReferencingEntity<T extends ISelfReferencingEntity<T>>
        extends IChildEntity<T> {
}
interface ISelfReferencingEntity<T extends ISelfReferencingEntity<T> & IChildEntity<T>>
        extends IChildEntity<T> {
}

Here comes an actual entity class applicable.

class Category implements ISelfReferencingEntity<Category> {

    @ManyToOne
    private Category parent;
}

The original concern is whether adding & IChildEntity<T> part along with extends IChildEntity<T> is redundant or not.


Solution

  • T extends ISelfReferencingEntity<T> implies T extends IChildEntity<T> since ISelfReferencingEntity<T> is a subtype of IChildEntity<T>. Therefore, adding & IChildEntity<T> to T extends ISelfReferencingEntity<T> is redundant.

    The following definition is preferred:

    interface ISelfReferencingEntity<T extends ISelfReferencingEntity<T>>
            extends IChildEntity<T> {
    }