我想编写一个通用方法来打印我发送给它的任何类型的数组。我试过了
public static <T> void printArr(T[] a)
{
int length = a.length;
for(int i = 0; i < length; i++)
{
System.out.print(a[i] + " ");
}
}
但是当我尝试使用一组int时,它会给我一个错误,说明&#34;更改方法&#39; printArr(T [])&#39; to&#39; printArr(int [])&#39;。它是一种常规方法。有谁知道怎么做?
答案 0 :(得分:0)
我猜你使用的是原始类型int
但是在这里,需要一个Object
的数组,所以你必须使用包装器Integer
:
print(new Integer[] { 1,2,3,4 });
答案 1 :(得分:0)
使用Java的泛型a generic type parameter must stand for an actual object type and not a primitive type。因此,您无法将int[]
(或任何其他基本类型的数组)传递给期望通用数组的方法。
您可以创建包装类型Integer[]
的数组(或将现有的int[]
复制到Integer[]
)并将其传递给printArr
,否则您可以重载printArr
接受int[]
。
答案 2 :(得分:0)
非常肯定你不能使用整数,因为任何使用泛型的方法都必须能够转换为一个对象,而int不是(它是一个基元)。如果你要提供一个整数数组,我相信它会正常工作。
答案 3 :(得分:0)
看看如何实现等效函数Arrays.toString()
(JavaDoc)。它的一个功能是Object[]
,例如Integer[]
,每种原始数组一个int[]
。这是Object[]
和int[]
版本的代码:
public static String toString(Object[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(String.valueOf(a[i]));
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
从这段代码中可以学到很多东西。例如,它没有以任何方式使用泛型。
如果你真的想要创建一个可以接受任何数组的方法,那么它可能需要一个Object
,然后你可以检查它的类,并调用相应的Arrays.toString()
(或生成一个字符串手动)。然而,可能不是一个好主意。我们有超载是有原因的。
编辑: 只是为了好玩,这里有一个可以接受任何数组的方法。实际上,任何对象都可以。
public static void printAny(Object arr) {
Class<?> cl = arr.getClass();
if (cl.isArray()) {
Class<?> type = cl.getComponentType();
if (!type.isPrimitive()) {
System.out.println(Arrays.toString((Object[]) arr));
} else {
switch (type.toString()) {
case "int":
System.out.println(Arrays.toString((int[]) arr));
break;
}
}
} else {
System.out.println(arr);
}
}