Какая польза от этой схемы дизайна?

interface Base<T extends Base> {

    T method();
}

Против этого шаблона

interface Base {

    Base method();
}

Единственное, я думаю, с method() в Base, я могу получить конкретный тип. Есть ли больше преимуществ?

Ответ 1

Вы просто сохраните один актерский состав. Вот пример:

class A implements Base<A> {
    ...
}


A a = ...;
A b = a.method();

против

class A implements Base {
    ...
}


A a = ...;
A b = (A)a.method();

Вы также можете использовать его с помощью параметра T по всему месту. Рассмотрим принятие T как параметра или определение локальной переменной типа T, например.

Ответ 2

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

Ответ 3

На самом деле это очень ясно. Во втором случае можно вернуть любой subclass of Base2. В первом случае такой двусмысленности нет.