我试图实现一个可以访问两个或更多可能的类对象的构造函数。 (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?
答案 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) {
//...
}