0

我正在尝试实现一个可以访问两个或多个可能的类对象的构造函数。(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) 与 Page.Builder 类型中的另一个方法具有相同的擦除 Builder(String, ModelCallbacks, Class)

当前的错误是有道理的,但我怎样才能实现或确保它clazz是 PageFragment 或 ListPageFragment 类型?

4

1 回答 1

2

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

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

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

您可以更改字段声明 -

private final Class<? extends Fragment> mFragmentClass;

编译错误是因为所有泛型类型信息在编译后都被删除(这意味着用它们的原始版本替换所有参数化类型,例如Class<ListPageFragment>用 just 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) {
     //...
}
于 2013-06-22T03:24:32.820 回答