我正在尝试编写一个通用小部件,它采用(任何)枚举集并弹出一个简单的表单以允许打开和关闭各个枚举。下面是该类的最小版本(实际上设置为在 android 上运行),但 eclipse 抱怨“AbstractCollection 类型中的方法 add(Capture#-7 of ?) 不适用于 arguments(T)”。
前几行我调用了 remove (具有完全相同的签名),没有任何问题。尝试先将枚举变成一个集合也无济于事。
我需要什么神奇的语法来解决这个问题?
我很可能也没有使用最好的类定义;)我使用的是 Android Developer Tools v21.1.0-569685,但问题也出现在 Eclipse 本身(Indigo)上
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)));
}
}
}