【问题标题】:Android - Generic Enum<?> abstract declaration does not fit with enum definition in extended classAndroid - 通用枚举<?> 抽象声明不符合扩展类中的枚举定义
【发布时间】:2015-10-21 14:33:08
【问题描述】:

我已将一些用于片段的函数移至基类

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(Enum label)

为什么 getFragmentFromLabel(Fragments label) 不满足这个要求?

【问题讨论】:

  • 将方法签名从...(Fragments label) 更改为...(Enum&lt;?&gt; label) 可以解决您的问题吗?然后将枚举转换为您需要的类型?
  • 是的!它正在处理该更改和此转换开关((片段)标签)谢谢!!,但是......这样方法接受任何类型的枚举,我可以限制儿童类中的方法只接受片段枚举类型?
  • 是的,我会回答的

标签: android generics android-fragments enums


【解决方案1】:

此错误是由您的方法签名引起的。基类的抽象方法的签名是...(Enum&lt;?&gt; label),这就是它对子类的期望。由于签名不同,它无法识别您正在覆盖该方法。将...(Fragments label) 更改为...(Enum&lt;?&gt; 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;
}

可能有更好的方法来完成此操作,希望对您有所帮助

【讨论】:

  • 很好,我想知道在Android Studio中哪里有一种方法可以在使用此方法时让代码自动完成工作,这样只能检测到Fragments枚举
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多