2016-03-11 70 views
1

我有一個方法看起來像這樣。我該怎麼做<T super V>?

public static <E extends Enum<E> & FieldEnum<E, V>, V> 
    void fieldValues(class<E> enumType, 
        Collection<? super V> fieldValues) { 
    for (enumConstant : enumType.getEnumConstants()) { 
     fieldValues.add(enumConstant.fieldValue()); 
    } 
} 

它可能工作。

List<Some> list = new ArrayList<>(); 
fieldValues(Some.class, list); 

現在我想改變方法來返回給定的收集參數(fieldValues)。我做到了。

public static <E extends Enum<E> & FieldEnum<E, V>, V, T super V> 
    Collection<T> fieldValues(Class<E> enumType, 
           Collection<T> fieldValues) { 
    for (E enumConstant : enumType.getEnumConstants()) { 
     fieldValues.add(enumConstant.fieldValue()); 
    } 
    return fieldValues; 
} 

編譯器抱怨。

com/github/.../lang/FieldEnums.java:[78,61] > expected 
com/github/.../lang/FieldEnums.java:[78,62] illegal start of type 
com/github/.../lang/FieldEnums.java:[78,69] '(' expected 

我該如何解決這個問題?什麼是回收給定收藏的正確方法,以便我能做

List<Some> = fieldValues(Some.class, new ArrayList<Some>()); 

我發現我只是

public static <E extends Enum<E> & FieldEnum<E, V>, V> 
    Collection<? super V> fieldValues(
    Class<E> enumType, Collection<? super V> fieldValues) { 
    for (E enumConstant : enumType.getEnumConstants()) { 
     fieldValues.add(enumConstant.fieldValue()); 
    } 
    return fieldValues; 
} 

是否有任何其他的方式比這更好的?

回答

1

我正在回答我自己的問題,以便任何有類似問題的人都能幫助自己。

public static <E extends Enum<E> & FieldEnum<E, V>, V, 
       T extends Collection<? super V>> 
    T fieldValues(Class<E> enumType, T fieldValues) { 
    for (E enumConstant : enumType.getEnumConstants()) { 
     fieldValues.add(enumConstant.fieldValue()); 
    } 
    return fieldValues; 
} 

現在我可以做到這一點。

List<Some> list = fieldValues(Some.class, new ArrayList<>()); 
+1

這是真的編譯,還是你的方法返回'T'而不是'集合''?你不應該把'Collection <>'分配給'List <>',而不要拋棄泛型。 –

+0

@MarkPeters對不起,修正。 –