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

标签 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) has the same erasure Builder(String, ModelCallbacks, Class) as another method in type Page.Builder

当前错误是有道理的,但我如何实现或确保 clazz 是 PageFragment 或 ListPageFragment 类型?

最佳答案

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

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) {
     //...
}

关于java - 具有多个可能类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17247016/

相关文章:

java - 如何更改 JEditorPane 中选定文本的颜色?

Java Applet 编译得很好但无法运行

java - GWT Guice/Gin 在服务器端的问题

android - 语法错误sqlite内部联接

java - 包含多个图像的幻灯片放映?

Android - 计时器布局未更新

java - 按下按钮时应用程序崩溃

java -/bin 在 JDK 中丢失

java - Perl 的 pack 函数在 Java 中等效

android - 未能找到内容提供商信息