Если тип возвращаемого значения должен быть типом класса, который реализует интерфейс, то то, что вы хотите, называется 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
для объявления того, что унаследованный метод каждого перечисления compareTo(E)
применяется только к другим перечислениям этого конкретного типа.
Если вы будете использовать этот шаблон достаточно часто, вы столкнетесь со сценариями, в которых вам нужно, чтобы this
был типа T
. На первый взгляд может показаться очевидным, что это 1 , но на самом деле вам нужно объявить метод abstract T getThis()
, который реализаторы должны будут тривиально реализовать как return this
.
[1] Как отметили комментаторы, можно сделать что-то подлое, например X implements A<Y>
, если X
и Y
будут правильно взаимодействовать. Наличие метода T getThis()
делает еще более очевидным, что X
обходит намерения автора интерфейса A
.