Если это должен быть тип параметра, использование обобщений, вероятно, является лучшим вариантом. Я бы сделал небольшую поправку, чтобы избежать необработанного типа в объявлении класса:
public abstract class A<T extends A<T>> {
Если, однако, у вас есть особый случай, когда инициализируемый объект должен быть заново создан, вы можете включить создание в метод, тем самым устраняя необходимость передавать этот объект в качестве параметра:
public abstract class A {
public A clone() {
}
}
public class B extends A {
public B clone() {
// copy state
}
}