3 回答
TA贡献1831条经验 获得超9个赞
由于 anenum X隐式是 的子类Enum<X>,请将方法声明更改为:
public static String arrayListToString(ArrayList<? extends Enum> arrayList)
然而,为什么要这样做呢?
在toString()一个枚举返回name()默认状态下,所以你不需要调用name(),这意味着你真的不关心什么是在列表中了,所以这更普遍有用的方法也可以工作:
public static String listToString(List<?> list) {
StringBuilder buf = new StringBuilder();
boolean first = true;
for (Object value : list) {
if (first)
first = false;
else
buf.append(", ");
buf.append(value);
}
return buf.toString();
}
它甚至可以比这更简单:
public static String toString(Iterable<?> iterable) {
StringJoiner joiner = new StringJoiner(", ");
for (Object value : iterable)
joiner.add(String.valueOf(value));
return joiner.toString();
}
或者使用 Java 8+ 流:
public static String toString(Collection<?> coll) {
return coll.stream().map(Object::toString).collect(Collectors.joining(", "));
}
TA贡献1895条经验 获得超7个赞
更改签名arrayListToString()
从此:
public static String arrayListToString(ArrayList<Enum> arrayList)
对此:
public static String arrayListToString(ArrayList<? extends Enum> arrayList)
在该剧的核心理念是,List<Integer>
是不是一个List<Number>
,即使一个Integer
是一个Number
。这是有道理的,因为您可以将 aDouble
放入 aList<Number>
但不能将 aDouble
放入 a List<Integer>
。
同样,aList<RewardType>
不是 a List<Enum>
,即使 aRewardType
是Enum
。
但是,AList<RewardType>
是List<? extends Enum>
。这是因为我们现在说列表是某种枚举的列表,而不是任何枚举的列表。
TA贡献1793条经验 获得超6个赞
正如 Ben 所提到的,您应该使用类型泛型来正确评估类型。
除此之外,您的方法略有未优化。考虑使用StringBuilder以防止创建垃圾String对象,并删除isEmpty循环内的冗余检查:
public static <T extends Enum<?>> String enumListToString(List<T> list){
if(list.size() < 1)
return "";
StringBuilder sb = new StringBuilder();
sb.append(list.get(0).name());
for (int i = 1; i < list.size(); i++) {
sb.append(", ").append(list.get(i));
}
return sb.toString();
}
添加回答
举报