我正在使用Android应用程序,我遇到了这种情况:
-GenericOrderDetailFragment,一个扩展Fragment的抽象类。
- 这个类的三个非抽象“儿子”:LinesFragment,HeaderFragment,NoteFragment。
在三个儿子中有很多方法是相同的,所以我在抽象类上声明,这就是它存在的原因。
我特别坚持一个。到现在为止,我把这个方法放在儿子里面并且效果很好:
public class LinesFragment extends GenericOrderDetailFragment {
[...]
public static LinesFragment newInstance(Order o) {
LinesFragment fragment = new LinesFragment();
putSerializable(o, fragment);
return fragment;
}
[...]
}
这个方法在所有的子中是相同的,除了返回类型:LinesFragment应该返回一个LinesFragment实例,HeaderFragment应该返回一个HeaderFragment istance ...我想把它作为mustoverride在父类中,但我不能做这是因为:
简单地把
public static GenericOrderDetailFragment newInstance(Order o) {
GenericOrderDetailFragment fragment = new GenericOrderDetailFragment();
putSerializable(o, fragment);
return fragment;
}
方法不起作用,仅仅因为我无法实现GenericOrderDetailFragment(它是抽象的)。我无法解释 此 .getClass()项,因为没有 this :该方法是静态的!
我不能声明一个“静态抽象”方法(在java静态中是“不可覆盖”而抽象是“mustoverride”,因此它们不能共存),所以我不能强制扩展GenericOrderDetailFragment的用户覆盖该方法。 / p>
如果我扩展这个Generic Class,我必须有一些方法,所以我不能声明不抽象父类。
我可以使用任何解决方法吗?提前谢谢!
答案 0 :(得分:4)
您可以使用反射:
public static <T extends GenericOrderDetailFragment> T newInstance(Class<T> cl, Order o) {
Constructor<T> c = cl.getConstructor();
T fragment = c.newInstance();
...
}
请注意,我遗漏了Exception
。所以你必须自己进行异常处理。
但基本上这应该是你要搜索的内容。
答案 1 :(得分:1)
如果您希望用户覆盖newInstance(Order o)
,则可以在Exception
的{{1}}中添加newInstance(Order o)
。这样,您就强制用户覆盖它。