Я бы хотел установить тип возвращаемого значения моего абстрактного метода таким же, как у класса, а не тип абстрактного класса, но тот же тип, что и унаследованного класса.
Вы можете использовать шаблон самостоятельного ввода:
abstract class A<T extends A<T>> { abstract T foo(); } class B extends A<B> { B foo() { return this; } }
Все три из них делают одно и то же.
public class TestAbstract { public static void main(String[] args) { B b1 = new B(); A a1 = b1.getMyClass(); System.out.println(a1.getClass().getName()); A a2 = b1.getItThisWay(); System.out.println(a2.getClass().getName()); A a3 = b1; System.out.println(a3.getClass().getName()); } } abstract class A { abstract public A getMyClass(); } class B extends A { public A getMyClass() { return this; } public A getItThisWay() { return this; } }