我有以下代码克隆:
public ArrayList<Short> getShortList(ArrayList<Number> numberList) {
ArrayList<Short> shortList = new ArrayList<Short>();
for(Number n : numberList) {
shortList.add((Short)n);
}
return shortList;
}
public ArrayList<Long> getLongList(ArrayList<Number> numberList) {
ArrayList<Long> longList = new ArrayList<Long>();
for(Number n : numberList) {
longList.add((Long)n);
}
return longList;
}
如何制作这些方法的一个功能?我在传递ArrayList的类型作为参数时遇到了麻烦。
答案 0 :(得分:3)
这将是实现所需行为的通用方法:
public <T> List<T> getList(List<? super T> numberList, Class<T> clazz) {
List<T> longList = new ArrayList<T>();
for(Object n : numberList) {
longList.add(clazz.cast(n));
}
return longList;
}
请注意,如果误用,该方法可能会抛出ClassCastException
。
以下是如何使用该方法的示例:
List<Number> listNumber = new ArrayList<Number>();
listNumber.add(5L);
listNumber.add(10L);
listNumber.add(25L);
List<Long> listLong = getList(listNumber, Long.class);
System.out.println(listNumber);
System.out.println(listLong);
//this line will throw CastClassException because elements in listNumber are Long only
List<Short> listShort = getList(listNumber, Short.class);
System.out.println(listShort);
答案 1 :(得分:2)
试试这个:
public <T extends Number> List<T> getList(List<Number> list) {
List<T> otherList = new ArrayList<T>();
for(Number n : list) {
otherList.add((T) n);
}
return otherList;
}
对于某些情况,此代码可能会抛出ClassCastException
,例如,当参数中的Number
之一无法转换为您调用此方法的上下文所期望的类型时,如下所示:
List<Number> argument = new ArrayList<Number>();
argument.add(5.0);
List<Integer> list = getList(argument);