我正在尝试实现一个可以访问两个或多个可能的类对象的构造函数。 (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/