2016-03-11 35 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对不起,修正。 –