实现"静态抽象和可继承"方法

时间:2014-10-06 13:02:40

标签: java android inheritance static abstract

我正在使用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,我必须有一些方法,所以我不能声明不抽象父类。

我可以使用任何解决方法吗?提前谢谢!

2 个答案:

答案 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)。这样,您就强制用户覆盖它。