对多种数据类型使用相同的功能

时间:2017-06-01 21:18:10

标签: java types

是否可以针对不同的数据类型重用相同的函数? 例如,我有一个将Integer ArrayList转换为Integer数组的函数

public static int[] arrayListToIntArray(ArrayList<Integer> list) {
    int[] out = new int[list.size()];
    int count = 0;
    for (int x : list) {
        out[count] = x;
        count++;
    }
    return out;
}

但是如果我想用字节ArrayList来做这件事我必须这样做

public static byte[] arrayListToByteArray(ArrayList<Byte> list) {
    byte[] out = new byte[list.size()];
    int count = 0;
    for (byte x : list) {
        out[count] = x;
        count++;
    }
    return out;
}

所以我想知道是否有更好的方法,而不仅仅是使用不同的数据类型重复相同的代码,并且基本上有相同代码的整个类?或者我可以做些什么,以便它可以用于所有数据类型?

2 个答案:

答案 0 :(得分:3)

是的,你可以。它被称为Generics

public static <T> T[] arrayListToIntArray(ArrayList<T> list) {
    T[] out = (T[]) new Object[list.size()];
    int count = 0;
    for (T x : list) {
        out[count] = x;
        count++;
    }
    return out;
}

更新

您无法实例化通用类型,因此您也可以传递另一个属于该类型的参数,请查看this

public static <T> T[] arrayListToIntArray(ArrayList<T> list, Class<T> t ) {
        T[] out = (T[]) Array.newInstance(t, list.size());
        int count = 0;
        for (T x : list) {
            out[count] = x;
            count++;
        }
        return out;
    }

答案 1 :(得分:1)

将方法中的输入更改为Generics,您可以写这个

public static <T> T[] arrayListToArray(ArrayList<T> list, Class<T> type) {
    @SuppressWarnings("unchecked")
    final T[] out = (T[]) Array.newInstance(type, list.size());
    int count = 0;
    for (T x : list) {
        out[count] = x;
        count++;
    }
    return out;
}

然后像这样使用它

public static void main(String[] args) {
    ArrayList<Integer> intList = new ArrayList<>();
    intList.add(13);
    intList.add(37);
    intList.add(42);
    Integer[] intArray = arrayListToArray(intList, Integer.class);

    ArrayList<Byte> byteList = new ArrayList<>();
    byteList.add((byte) 0xff);
    byteList.add((byte) 'y');
    byteList.add((byte) 17);
    Byte[] byteArray = arrayListToArray(byteList, Byte.class);

    System.out.println(Arrays.toString(intArray));
    System.out.println(Arrays.toString(byteArray));
}

输出:

[13, 37, 42]
[-1, 121, 17]