我有一个通用类,如下所示:
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
中?