Ответ 1
Если тип возвращаемого типа должен быть типом класса, который реализует интерфейс, то то, что вы хотите, называется F-ограниченным типом:
public interface A<T extends A<T>>{ public T b(); }
public class C implements A<C>{
public C b() { ... }
}
public class D implements A<D>{
public D b() { ... }
}
В словах A
объявляется параметр типа T
, который будет принимать значение каждого конкретного типа, реализующего A
. Обычно это используется для объявления таких вещей, как методы clone()
или copy()
, которые хорошо типизированы. В качестве другого примера он использовал java.lang.Enum
, чтобы объявить, что каждый enum, наследуемый метод compareTo(E)
применяется только к другим перечислениям этого конкретного типа.
Если вы используете этот шаблон достаточно часто, вы столкнетесь с сценариями, где вам нужно this
быть типа T
. На первый взгляд может показаться очевидным, что это 1 но вам действительно нужно объявить метод abstract T getThis()
, который разработчикам придется тривиально реализовать как return this
.
[1] Как отмечают комментаторы, можно сделать что-то скрытое, как X implements A<Y>
, если X
и Y
взаимодействовать должным образом. Наличие метода T getThis()
еще более ясно показывает, что X
обходит намерения автора интерфейса A
.