具有多个可能类的构造函数

时间:2013-06-22 03:16:51

标签: java android

我试图实现一个可以访问两个或更多可能的类对象的构造函数。 (PS。对于那些质疑静态类的人来说,这是一个内部类)

...

public static class Builder {
    protected String mTitle;
    protected List<ReviewItem> mPages = new ArrayList<ReviewItem>();
    protected boolean mRequired = false;
    protected String mParentKey;
    private final ModelCallbacks mModelCallbacks;
    private final Class<Fragment> mFragmentClass;

    public Builder(String title, ModelCallbacks callbacks, Class<PageFragment> clazz) {
        mTitle = title;
        mModelCallbacks = callbacks;
        mFragmentClass = clazz;
    }

    public Builder(String title, ModelCallbacks callbacks, Class<ListPageFragment> clazz) {
        mTitle = title;
        mModelCallbacks = callbacks;
        mFragmentClass = clazz;
    }

}

...

ListPageFragment继承

java.lang.Object    
    ↳    android.app.Fragment
        ↳    android.app.ListFragment
            ↳    my.app.ListPageFragment

PageFragment继承

java.lang.Object    
    ↳    android.app.Fragment
        ↳    my.app.PageFragment

错误:

  

Method Builder(String,ModelCallbacks,Class)具有   相同的擦除Builder(String,ModelCallbacks,Class)作为另一种   Page.Builder类型中的方法

当前错误有意义,但我如何实现或确保clazz的类型为PageFragment或ListPageFragment?

1 个答案:

答案 0 :(得分:2)

您可以按如下方式更改签名 -

public Builder(String title, ModelCallbacks callbacks, Class<? extends Fragment> clazz) {

这样你就不需要两个或更多的构造函数了,一个就足够了。

您可以更改字段声明 -

private final Class<? extends Fragment> mFragmentClass;

编译错误是因为编译后所有通用类型信息都被删除(这意味着用原始版本替换所有参数化类型,例如Class<ListPageFragment>只有Class)。在您的情况下,以下是类型擦除后两个构造函数的签名 -

public Builder(String title, ModelCallbacks callbacks, Class clazz) {

修改

如果您必须将可能的类型限制为您提到的两种类型,那么最好有两个静态工厂方法 -

public static Builder withPageFragment(String title, 
                                       ModelCallbacks callbacks, 
                                       Class<PageFragment> clazz) {
     //...
}

public static Builder withListPageFragment(String title, 
                                           ModelCallbacks callbacks, 
                                           Class<ListPageFragment> clazz) {
     //...
}