0

私は、(任意の) 列挙セットを受け取り、単純なフォームをポップアップして、個々の列挙型のオンとオフを切り替えることができる汎用ウィジェットを作成しようとしています。以下は、クラスの最小バージョン (実際には Android で実行するように設定されています) ですが、Eclipse は「AbstractCollection 型のメソッド add(Capture#-7 of ?) は引数 (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)));
    }
  }
}
4

1 に答える 1

0

JB Nizet のコメントを反映して、クラスを次のように宣言する必要があります。

EnumSetSelector<T extends Enum<T>>

つまり、and が宣言するのと同じ再帰的境界を使用EnumEnumSetます。

次に、の代わりにthesetand esvalsasを必ず入力してください。EnumSet<T>EnumSet<?>

于 2013-03-24T21:55:21.220 に答える