3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于 anenum X隱式是 的子類(lèi)Enum<X>,請(qǐng)將方法聲明更改為:
public static String arrayListToString(ArrayList<? extends Enum> arrayList)
然而,為什么要這樣做呢?
在toString()一個(gè)枚舉返回name()默認(rèn)狀態(tài)下,所以你不需要調(diào)用name(),這意味著你真的不關(guān)心什么是在列表中了,所以這更普遍有用的方法也可以工作:
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();
}
它甚至可以比這更簡(jiǎn)單:
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貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
更改簽名arrayListToString()
從此:
public static String arrayListToString(ArrayList<Enum> arrayList)
對(duì)此:
public static String arrayListToString(ArrayList<? extends Enum> arrayList)
在該劇的核心理念是,List<Integer>
是不是一個(gè)List<Number>
,即使一個(gè)Integer
是一個(gè)Number
。這是有道理的,因?yàn)槟梢詫?aDouble
放入 aList<Number>
但不能將 aDouble
放入 a List<Integer>
。
同樣,aList<RewardType>
不是 a List<Enum>
,即使 aRewardType
是Enum
。
但是,AList<RewardType>
是List<? extends Enum>
。這是因?yàn)槲覀儸F(xiàn)在說(shuō)列表是某種枚舉的列表,而不是任何枚舉的列表。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
正如 Ben 所提到的,您應(yīng)該使用類(lèi)型泛型來(lái)正確評(píng)估類(lèi)型。
除此之外,您的方法略有未優(yōu)化??紤]使用StringBuilder以防止創(chuàng)建垃圾String對(duì)象,并刪除isEmpty循環(huán)內(nèi)的冗余檢查:
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();
}
添加回答
舉報(bào)