用 Java 编写通用枚举集小部件 - 无法获得正确的语法



我试图写一个通用的小部件,它需要一个(任何)枚举集,并弹出一个简单的表单,以允许单个枚举被打开和关闭。下面是类的最小版本(实际上设置为在android上运行),但是eclipse抱怨"AbstractCollection类型中的add(Capture#-7 of ?)方法不适用于参数(T)"。

前面几行我调用了remove(它具有完全相同的签名),没有问题。尝试先将enum转换为set也没有帮助。

我需要什么神奇的语法来解决这个问题?

我可能也没有使用最好的类定义;)我正在使用Android开发人员工具v21.1.0-569685,但问题也出现在Eclipse正确(靛蓝)

package com.test.ui;
import java.util.EnumSet;
import android.util.Log;
import android.view.View;
import android.view.LayoutInflater;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
public class EnumSetSelector<T extends Enum<?>> implements OnClickListener{
  Class<T> enumclass;
  EnumSet<?> theset; // EnumSet<T> theset; fails
  boolean haschanged;
  public EnumSetSelector(Class<T> eclass) {
    enumclass = eclass;
  }
  public ViewGroup prepareSet(EnumSet<?> esvals, ViewGroup vg, LayoutInflater li) {
    theset = esvals;
    T[] allvals = enumclass.getEnumConstants();
    Log.d("XXXXXXZ","here are " + allvals.length);
    ViewGroup grp = (ViewGroup)li.inflate(R.layout.ui_enum_selector,vg,false);
    for (T av:allvals) {
      Log.d("XXXXXXZ"," - " + av);
      CheckBox cb = (CheckBox)li.inflate(R.layout.ui_enum_selector_entry,vg,false);
      cb.setText(String.valueOf(av));
      cb.setChecked(theset.contains(av));
      cb.setTag(av);
      grp.addView(cb);
      esvals.remove(av);
    }
    vg.addView(grp);
    return grp;
  }
  @Override
  public void onClick(View v) {
    final T thisenum = (T)v.getTag();
    final boolean oldval = theset.contains(thisenum);
    final CheckBox cb = (CheckBox)v;
    if (cb.isChecked() != oldval) {
      if (cb.isChecked()) {
        cb.setChecked(false);
        theset.remove(thisenum);
      } else {
        cb.setChecked(true);
        theset.add(thisenum);
        theset.add(EnumSet.of(thisenum));
      }
      Log.d("XXXXXXZ", "" + String.valueOf(v.getTag()) + " now "
        + (theset.contains(thisenum)));
    }
  }
}

响应JB Nizet的注释,您应该将您的类声明为:

EnumSetSelector<T extends Enum<T>>

换句话说,与EnumEnumSet声明的递归界相同。

然后确保输入thesetesvalsEnumSet<T>而不是EnumSet<?>

相关内容

  • 没有找到相关文章

最新更新