我怎么能<t super =“”v =“”>?

时间:2016-03-11 02:43:46

标签: java generics

我的方法看起来像这样。

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 个答案:

答案 0 :(得分: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<>());