Я уже давно использовал идиому в Java для использования информации о классе (не абстрактного) класса в методах его (обычно абстрактного) класса предков (к сожалению, я не могу найти имя этого шаблон):
public abstract class Abstract<T extends Abstract<T>> {
private final Class<T> subClass;
protected Abstract(Class<T> subClass) {
this.subClass = subClass;
}
protected T getSomethingElseWithSameType() {
....
}
}
Пример подкласса:
public class NonGeneric extends Abstract<NonGeneric> {
public NonGeneric() {
super(NonGeneric.class);
}
}
Однако мне трудно определить подкласс Abstract
, который имеет свои собственные общие параметры:
public class Generic<T> extends Abstract<Generic<T>> {
public Generic() {
super(Generic.class);
}
}
Этот пример не компилируется; аналогичным образом, невозможно указать общие типы, например, Generic<T>.class
или даже использовать подстановочный знак, например Generic<?>
.
Я также попытался заменить объявление универсального типа T
в суперклассе на ? extends T
, но это тоже не компилируется.
Есть ли способ заставить этот шаблон работать с базовыми базовыми классами?