我怎样才能简化这两种方法,它们看起来很像?

时间:2014-04-30 14:43:15

标签: java arraylist

我有以下代码克隆:

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的类型作为参数时遇到了麻烦。

2 个答案:

答案 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);