2013-03-24 1 views
0

(모든) enumset을 사용하고 개별 열거 형을 활성화 할 수있는 간단한 양식을 표시하는 일반 위젯을 작성하려고합니다. 꺼져. 아래는 클래스의 최소 버전입니다 (실제로 안드로이드에서 실행하도록 설정되어 있습니다.) eclipse는 "AbstractCollection 유형의 메소드 add (? 캡처? -7)는 인수 (T)에 적용 할 수 없습니다"라는 신음 소리를냅니다.Java에서 일반적인 enumset 위젯 작성 - 구문을 올바르게 가져올 수 없음

몇 줄 앞에서 문제가없는 remove (정확하게 동일한 서명이 있음)가 호출되었습니다. 열거 형을 집합으로 바꾸는 것은 도움이되지 않습니다.

이 문제를 해결하는 데 필요한 마법 구문은 무엇입니까?

나도 최선의 클래스 정의를 사용하지 잘 수

, 나는 안드로이드 개발자 도구 v21.1.0-569685을 사용하고 있습니다)하지만 문제는 적절한 이클립스에 표시됩니다 (인디고)

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))); 
    } 
    } 
} 
+2

EnumSet 에 null을 제외한 아무 것도 추가 할 수 없습니다. 그 이유는 세트의 유형을 모르기 때문입니다. 세트를'EnumSet '로 만들고 클래스를'EnumSetSelector >'으로 만들면 어떻게됩니까? –

+0

"'EnumSet theSet;'fails ': 좀 더 구체적으로 말씀해주십시오 : 컴파일에 실패 했습니까? 그렇다면 컴파일 오류가 무엇입니까? – meriton

+0

Ooh yes JB - 내가 T EnumSet을 사용하면 작동합니다. EnlightSet 어디서나, 괜찮습니다. 이전에 시도해 보았다고 생각했지만, 그 동안 이클립스도 업그레이드했습니다 ... 너무 오래 서클에서 돌아 다니는 경우가 있습니다. 핑! Meriton - 첫 번째 단락에 있습니다. – pootle

답변

0

EnumEnumSet 선언 그 같은 재귀 경계에, 즉

EnumSetSelector<T extends Enum<T>> 

: JB Nizet의 의견을 반향, 당신은 당신의 클래스를 선언해야한다.

EnumSet<?> 대신 thesetesvalsEnumSet<T>으로 입력하십시오.

관련 문제