如何在Java中将一个通用列表转换为另一个?

4
我试图将一个通用的枚举列表转换为另一个通用列表类型,但总是遇到以下编译错误:

不适用于参数

private static <T extends Enum<T>> List<T> enumListFromEnumList(List<Object> sourceEnumsList, Class<T> classObject) {
        List<T> enums = new ArrayList<T>();

        if(sourceEnumsList != null) {
            for(Object enumObject : sourceEnumsList) {
                if (enumObject instanceof Enum)
                    enums.add(Enum.valueOf(classObject, enumObject.toString().toUpperCase()));
            }
        }

        return enums;
    }

即使我尝试过这样做:

private static <T extends Enum<T>> List<T> enumListFromEnumList(List<T> sourceEnumsList, Class<T> classObject) {
        List<T> enums = new ArrayList<T>();

        if(sourceEnumsList != null) {
            for(T enumObject : sourceEnumsList) {
                enums.add(Enum.valueOf(classObject, enumObject.toString().toUpperCase()));
            }
        }

        return enums;
    }

这是我使用该函数的方式:
adapterInfo.setResponseTypeList( enumListFromEnumList(info.getResponseTypeList(), CAPInfo.ResponseType.class));

更新:

当我将其转换为以下内容时,它可以正常工作:

private static <S extends Enum<S>, T> List<S> enumListFromEnumList(List<T> sourceEnumsList, Class<S> classObject) {
        List<S> enums = new ArrayList<S>();

        if(sourceEnumsList != null) {
            for(T enumObject : sourceEnumsList) {
                enums.add(Enum.valueOf(classObject, enumObject.toString().toUpperCase()));
            }
        }

        return enums;
    }

现在的问题是如何翻译 "<S extends Enum<S>, T> List<S>" 部分(我指的是它的工作原理)


看起来你正在尝试用复杂的方法做一些简单的事情。你能描述一下你手头有什么,以及你想要实现什么目标吗?这样别人就可以建议最简单的方法来完成它了。 - Bobulous
1
此外,在处理枚举时,通常应该使用 EnumSet 而不是 List(除非你需要重复的值或自定义顺序)。 - Sean Patrick Floyd
感谢您的改进... - Yanflea
1个回答

1

这是您正在寻找的内容(我想):

enum EnumA {
    FIRST,
    SECOND,
    THIRD
}

enum EnumB {
    FIRST,
    SECOND,
    THIRD
}

private static <A extends Enum<A>, B extends Enum<B>> List<B> enumListFromEnumList(List<A> sourceEnumsList, Class<B> classObject) {
    List<B> enums = new ArrayList<B>();

    if (sourceEnumsList != null) {
        for (A enumObject : sourceEnumsList) {
            enums.add(Enum.valueOf(classObject, enumObject.toString().toUpperCase()));
        }
    }

    return enums;
}

public static void main(String[] args) {
    List<EnumA> listA = new ArrayList<EnumA>();
    listA.add(EnumA.FIRST);
    listA.add(EnumA.THIRD);
    List<EnumB> listB = enumListFromEnumList(listA, EnumB.class);
    System.out.println(listB);
}

你能解释一下 <S extends Enum<S>, T> List<S> 或者 <A extends Enum<A>, B extends Enum<B>> 的意思吗?抱歉,我对泛型还不熟悉。 - Ifi
<A extends Enum<A>, B extends Enum<B>>:这是您在方法中“声明”要使用的泛型,并对它们应用约束的部分。在这里,您需要两个泛型,都继承自Enum类。为什么枚举继承要像这样构造有点复杂,请查看谷歌上的相关资料。 "List<B>":这是返回类型。 - Yanflea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接