2011-01-23 20 views
8

generics hakkında bir sorum var. Hiç derleme olmayan bu yönteme sahibim. Derleyici bana şöyle diyor: type parameter E is not within its bound. Derleyici hatalarını anlamada genellikle bir problemim var, ama bu oldukça zor. Belki de jeneriklerle ilgili bilgimin gelişmesi gerekiyor. :-) Herkes bana neyin yanlış olduğunu söyleyebilir mi? Java Generics Soru: Parametre E'nin kendi paragrafında olmadığı

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; 
} 

Bu

StringConvertableEnum tanımı şudur: E extends Enum<E>

Düzenleme için deklarasyon değiştirmeniz gerekir

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

hat numarası şikayet ediyor mu? – bmargulies

+0

@bmargulies: EnumSet set = EnumSet.allOf (enumClass); çizgi. – Kraushauslaus

+0

Derinliğim bitti. Kodun benim için makul görünüyor. – bmargulies

cevap

9

, üzgün uzağa adım vardı, yani tam beyanıdır:

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

i) Bu, zorunlu olması gereken "getStringValue()" yöntemini kullanmadan enumlarda geçmesine izin verir. ii) 'getStringValue()' yönteminin kullanıldığı for döngüsünün gövdesini kaldırsam bile, derleme yapmaz. – Kraushauslaus

+0

@Kraushauslaus: "Enum E genişletir Enum" ile "Enum " uzantısını değiştirmek anlamına gelir: 'StringConvertableEnum ' parçanızı saklayabilirsiniz. –

+1

@Kraushauslaus @Yishai'nin her iki bildirimde de "" ifadesini kullanacağına ve hiçbir şeyi kaldırmadığına inanıyorum. Benim için derler. –

İlgili konular