Instancaite来自父级的子类的实例

时间:2014-06-19 14:05:56

标签: java android

首先,对于模糊的标题感到抱歉,但我真的想不出怎么说这个,所以如果你想到的话,请编辑一个更好的标题。

我有一个帮助器片段类(MasterFragment),它将永远不会被使用,它将永远被扩展,并且在其中有这种方法。

public static MasterFragment newInstance(Bundle bundle) {
    MasterFragment masterFragment = new MasterFragment();
    masterFragment.setArguments(bundle);
    return masterFragment;
}

当我扩展它时,让我们调用类ExtendedMasterFragment,我可以让newInstance方法返回ExtendedMasterFragment而不是MasterFragment的实例吗?

编辑:我的工作就是这个。

public static MasterFragment newInstance(Bundle bundle, MasterFragment masterFragment) {
    masterFragment.setArguments(bundle);
    return masterFragment;
}

并称之为

return ListExampleFragment.newInstance(null, new ListExampleFragment());

但是如果可能的话,我宁愿让newInstance在课堂上工作

1 个答案:

答案 0 :(得分:0)

您绝对可以使用newInstance方法返回子类的实例:

public enum Type { THIS, THAT, OTHER; }

public static MasterFragment newInstance(Bundle bundle, Type type) {
    MasterFragment frag;
    switch (type) {
        case THIS: frag = new ThisFrag(); break;
        // ...
    }
    frag.setArguments(bundle);
    return frag;
}

另一方面,工厂方法的返回类型是MasterFragment。如果您需要实例的实际类型,则必须进行转换(ewwwieee)。

你也可以这样做,虽然这真的很难看:

public static <T extends MasterFragment> T newInstance(Bundle bundle, Type type) {
    MasterFragment frag;
    switch (type) {
        case THIS: frag = new ThisFrag(); break;
        // ...
    }
    frag.setArguments(bundle);
    return (T) frag;  // type conversion warning here.
}

如果您使用泛型,这将起作用:

ThisFrag frag = newInstance(new Bundle(), Type.THIS);

育。对不起,我提到了。