2011-01-23 5 views
8

제네릭에 대한 질문이 있습니다. 나는이 방법을 전혀 컴파일하지 않습니다. 컴파일러에서 내게 알려줍니다 : type parameter E is not within its bound. 나는 보통 컴파일러 에러를 이해하는데 아무런 문제가 없다. 그러나 이것은 매우 까다 롭다. 어쩌면 제네릭에 대한 지식이 향상되어야 할 수도 있습니다. :-) 아무도 나에게 뭐가 잘못 됐는지 말해 줄 수 있니? Java Generics 질문 : 매개 변수 E가 해당 바인딩 내에 없습니다.

public static <E extends Enum & StringConvertableEnum<E>> Map<String, E> map(Class<E> enumClass) { 
    Map<String, E> mapping = new HashMap<String, E>(); 

    EnumSet<E> set = EnumSet.allOf(enumClass); 

    for(E enumConstant : set) { 
     mapping.put(enumConstant.getStringValue(), enumConstant); 
    } 

    return mapping; 
} 

StringConvertableEnum의 정의입니다 : 당신은 E extends Enum<E>

편집에 선언을 변경해야

public interface StringConvertableEnum<E extends Enum> { 
    public E getEnumFromStringValue(String string); 
    public String getStringValue(); 
} 
+0

라인 번호 불평하고 있으십니까? – bmargulies

+0

@bmargulies : EnumSet set = EnumSet.allOf (enumClass); 그 줄이야. – Kraushauslaus

+0

나는 내 깊이가있다. 귀하의 코드는 나에게 그럴듯 해 보입니다. 그런데 – bmargulies

답변

9

, 미안 멀리 단계로했다, 내 말은 전체 선언은 다음과 같습니다

public static <E extends Enum<E> & StringConvertableEnum<E>> Map<String, E> map(Class<E> enumClass) { 
+0

i) 이렇게하면 getStringValue() 메소드없이 열거 형을 전달할 수 있습니다. 이는 필수입니다. ii) getStringValue() 메소드가 사용되는 for-loop 본문을 제거하더라도 컴파일되지 않습니다. – Kraushauslaus

+0

@Kraushauslaus : 그는'E extends Enum'을'E extends Enum ''으로 변경하는 것을 의미합니다.'StringConvertableEnum '부분을 유지할 수 있습니다. –

+1

@Kraushauslaus @Yishai는 두 선언 모두에 ''을 삽입하고 아무 것도 제거하지 않는다는 것을 의미한다고 생각합니다. 나를 위해 컴파일. –