将枚举的 ArrayList 转换为字符串

我有以下enums,可以填充一个ArrayList:


public enum RewardType {

    POINTS, MONEY, TOKENS, RANDOM;

}


public enum OfferType {

    GIFT, DISCOUNT, LOTTERY;

}

要转换ArrayList为String我使用此方法:


public static String arrayListToString(ArrayList<Enum> arrayList) {

    String finalString = "";

    for (int i = 0; i < arrayList.size(); i++) {

        if (TextUtils.isEmpty(finalString)) {

            finalString = arrayList.get(i).name();

        } else {

            finalString = finalString + ", " + arrayList.get(i).name();

        }

    }

    return finalString;

}

然后我这样称呼它:


String rewardType = arrayListToString(mainModel.getRewardTypes()); 

//getRewardTypes returns an ArrayList<RewardType>

问题是,它arrayListToString是ArrayList<Enum>用ArrayList<enum>参数调用的,不能用参数调用(这是我的类的类型)。我也无法创建一个 type 的类Enum。由于enum!= Enum,我如何使arrayListToString方法与我的enum类一起工作?


偶然的你
浏览 123回答 3
3回答

天涯尽头无女友

由于 anenum X隐式是 的子类Enum<X>,请将方法声明更改为:public static String arrayListToString(ArrayList<? extends Enum> arrayList)然而,为什么要这样做呢?在toString()一个枚举返回name()默认状态下,所以你不需要调用name(),这意味着你真的不关心什么是在列表中了,所以这更普遍有用的方法也可以工作:public static String listToString(List<?> list) {&nbsp; &nbsp; StringBuilder buf = new StringBuilder();&nbsp; &nbsp; boolean first = true;&nbsp; &nbsp; for (Object value : list) {&nbsp; &nbsp; &nbsp; &nbsp; if (first)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; first = false;&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buf.append(", ");&nbsp; &nbsp; &nbsp; &nbsp; buf.append(value);&nbsp; &nbsp; }&nbsp; &nbsp; return buf.toString();}它甚至可以比这更简单:public static String toString(Iterable<?> iterable) {&nbsp; &nbsp; StringJoiner joiner = new StringJoiner(", ");&nbsp; &nbsp; for (Object value : iterable)&nbsp; &nbsp; &nbsp; &nbsp; joiner.add(String.valueOf(value));&nbsp; &nbsp; return joiner.toString();}或者使用 Java 8+ 流:public static String toString(Collection<?> coll) {&nbsp; &nbsp; return coll.stream().map(Object::toString).collect(Collectors.joining(", "));}

人到中年有点甜

更改签名arrayListToString()从此:public&nbsp;static&nbsp;String&nbsp;arrayListToString(ArrayList<Enum>&nbsp;arrayList)对此:public&nbsp;static&nbsp;String&nbsp;arrayListToString(ArrayList<?&nbsp;extends&nbsp;Enum>&nbsp;arrayList)在该剧的核心理念是,List<Integer>是不是一个List<Number>,即使一个Integer是一个Number。这是有道理的,因为您可以将 aDouble放入 aList<Number>但不能将 aDouble放入 a&nbsp;List<Integer>。同样,aList<RewardType>不是 a&nbsp;List<Enum>,即使 aRewardType是Enum。但是,AList<RewardType>&nbsp;是List<? extends Enum>。这是因为我们现在说列表是某种枚举的列表,而不是任何枚举的列表。

摇曳的蔷薇

正如 Ben 所提到的,您应该使用类型泛型来正确评估类型。除此之外,您的方法略有未优化。考虑使用StringBuilder以防止创建垃圾String对象,并删除isEmpty循环内的冗余检查:public static <T extends Enum<?>> String enumListToString(List<T> list){&nbsp; &nbsp; if(list.size() < 1)&nbsp; &nbsp; &nbsp; &nbsp; return "";&nbsp; &nbsp; StringBuilder sb = new StringBuilder();&nbsp; &nbsp; sb.append(list.get(0).name());&nbsp; &nbsp; for (int i = 1; i < list.size(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; sb.append(", ").append(list.get(i));&nbsp; &nbsp; }&nbsp; &nbsp; return sb.toString();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java