是否可以针对不同的数据类型重用相同的函数? 例如,我有一个将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;
}
所以我想知道是否有更好的方法,而不仅仅是使用不同的数据类型重复相同的代码,并且基本上有相同代码的整个类?或者我可以做些什么,以便它可以用于所有数据类型?
答案 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]