У меня есть универсальный класс, который выглядит следующим образом:
public abstract class Foo<T extends Foo<T>> {...
и другой класс, который выглядит следующим образом:
public abstract class Fum<T extends Fum<T,U>, U extends Foo<U>> {...
и, наконец, некоторые подклассы, которые выглядят следующим образом:
public class SubFoo extends Foo<SubFoo> {...
public class SubFum extends Fum<SubFum,SubFoo> {...
В абстрактных классах есть абстрактные методы, объявленные public abstract T create();
(с перегруженными версиями), которые отвечают за создание экземпляров объектов подкласса, используемых в методах суперкласса.
Однако, очевидно, я не могу просто написать new U()
в Fum
, чтобы получить экземпляр SubFoo
, поэтому я хочу какой-нибудь статический метод-заполнитель, который я могу переопределить.Однако я, очевидно, не могу написать public static abstract T create();
по тем причинам, которые я не могу понять.
Поэтому в Fum
я написал метод, который выглядит следующим образом:
@SuppressWarnings("unchecked")
protected static <V extends Foo<V>> V newSubFoo() {
try {//create() requires a constructed object to work.
return (V) Foo.class.asSubclass(Foo.class).newInstance().create();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
System.exit(1);
return null;
}//I don't expect this to work, but I don't know what to use before
} // the "asSubclass" call.
, который заставляет компилятор отключаться.Тем не менее, это, похоже, ни к чему меня не приведет.
В заключение: есть ли способ создать новый объект типа U
в Fum
, используя статический метод, который может быть переопределен в SubFoo
(желательно без записи пустого конструктора в Foo
)?