Единственное, я думаю, с 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. В первом случае такой двусмысленности нет.