Android - Generic Enum <! - ? - >抽象声明不适合扩展类中的枚举定义

时间:2015-10-21 14:33:08

标签: android generics android-fragments enums

我已将一些我使用片段的函数移动到基类

protected void changeToFragment(Enum<?> label){
    changeToFragment(label, false);
}

protected void changeToFragment(Enum<?> label, boolean addToBackStack){
    FragmentManager fragmentManager = getFragmentManager();
    if (addToBackStack){
        fragmentManager.beginTransaction()
                .replace(R.id.container, getFragmentFromLabel(label), label.toString())
                .addToBackStack(null)
                .commit();

    }
    else{
        fragmentManager.beginTransaction()
                .replace(R.id.container, getFragmentFromLabel(label), label.toString())
                .commit();
    }
}

protected abstract Fragment getFragmentFromLabel(Enum<?> label);

在扩展类中,我将枚举定义为对我的片段的引用

private enum Fragments {    FRAG_1,
                            FRAG_2,
                            FRAG_3
                        }

我已将抽象函数实现为

@Override
protected Fragment getFragmentFromLabel(Fragments label){
    switch(label){
        case FRAG_1: return getFragment1();
        case FRAG_2: return getFragment2();
        case FRAG_3: return getFragment3();
    }
    return null;
}

问题是我收到错误说:必须将类XXX声明为抽象或在FragmentBaseActivity中实现抽象方法 getFragmentFromLabel(枚举标签)

为什么getFragmentFromLabel(片段标签)不符合此要求?

1 个答案:

答案 0 :(得分:1)

此错误是由您的方法签名引起的。基类&#39;抽象方法的签名是...(Enum<?> label),因此它对子类的期望是什么。由于签名不同,它无法识别您覆盖该方法。将...(Fragments label)更改为...(Enum<?> label)将表明您现在正在覆盖抽象方法,从而修复错误。

这会让您遇到限制传入的已接受枚举的问题。您可以通过检查类型来完成此操作......例如。

@Override
protected Fragment getFragmentFromLabel(Enum<?> label){
if(label instanceof Fragments){
  switch(label){
    case FRAG_1: return getFragment1();
    case FRAG_2: return getFragment2();
    case FRAG_3: return getFragment3();
  }
}
return null;
}

可能有更好的方法来实现这一点,希望它有所帮助