如何使 Java 方法接受不同(原始)变量类型的数组?

How can I make a Java method accept arrays of different (primitive) variable types?

我想写一个简单的方法来打印一个数组 - 看起来像一个数组 - 及其在终端中的元素,而不管它是否是 int[]、boolean[]、String[]、double[]等等

String info 参数只是为了输出一些带有显示数组的答案短语,例如 "The wanted array is { .... }".

我知道 Java

但是不同版本的方法printArray(...)唯一的区别是参数列表中传递的数组的变量类型。

我也试过交一个object[] pArray作为参数,结果只能接受整型数组,或者运行时报错

前一个 post Parameter For All Primitive Types of Java? 的答案中提到了类似的概念,但是 - 尽管这几乎是同一个问题 - 答案没有给出简单基元数组的解决方案.他们只回答

看着这个“避免代码重复”的口头禅似乎被如此明显地违反了,我相信一定有更好的解决方案。

谁能帮我解决这个问题?这是代码:

void printArray(String info, boolean[] pArray)
{
    String arrayString = "";

    if (pArray.length > 0){
        arrayString = "{ " + pArray[0];

        for (int a = 1; a < pArray.length; a++){
            arrayString = arrayString + ", " + pArray[a];
        }
        arrayString = arrayString + " }";
    } else {
        arrayString = "{}";
    }

    System.out.println(info + arrayString + "\n");
}

void printArray(String info, int[] pArray)
{
    String arrayString = "";

    if (pArray.length > 0){
        arrayString = "{ " + pArray[0];

        for (int a = 1; a < pArray.length; a++){
            arrayString = arrayString + ", " + pArray[a];
        }
        arrayString = arrayString + " }";
    } else {
        arrayString = "{}";
    }

    System.out.println(info + arrayString + "\n"); 
}

是的。但是所有数组1唯一共同的祖先类型是Object。您可以使用它和 java.lang.reflect.Array。此外,由于 printArray 没有状态,您不妨将其 static 设置为

static void printArray(String info, Object pArray) {
    StringBuilder sb = new StringBuilder(info);
    int len = Array.getLength(pArray);
    if (len > 0) {
        sb.append("{ ").append(Array.get(pArray, 0));
        for (int a = 1; a < len; a++) {
            sb.append(", ").append(Array.get(pArray, a));
        }
        sb.append(" }");
    } else {
        sb.append("{}");
    }
    System.out.println(sb);
}

我测试了一下

public static void main(String[] args) {
    boolean[] bArr = { true, true, false, false };
    int[] iArr = { 0, 1, 2, 3 };
    printArray("boolean[]", bArr);
    printArray("int[]", iArr);
}

输出

boolean[]{ true, true, false, false }
int[]{ 0, 1, 2, 3 }

1原始类型和引用类型。 Object obj = new int[] { 1, 2, 3 };Object obj = new String[] { "Hello", "World" }; 都有效。所有数组都是 Java.

中的 Objects

您可以从基元数组创建流,然后从流创建对象数组。这是一个例子。

import java.util.Arrays;

public class ArrayPrinter {
    
    public static void printArray(Object[] arr) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.append(i == 0 ? arr[i] : " " + arr[i]);
        }
        System.out.println(sb.toString());
    }
        
    public static void main(String[] args) {
        int[] arr = new int[] {1, 2, 3, 4, 5, 6};
        Integer[] objs = Arrays.stream(arr).boxed().toArray(Integer[]::new);
        printArray(objs);
    }
}

一个方法有多个版本也很好,一个用于 int 数组,一个用于 boolean 数组,一个用于 String 数组,等等。这种策略称为方法重载,很常见。您可以在 java.lang.Math class 中查看方法重载的示例。 java.lang.Math.absjava.lang.Math.maxjava.lang.Math.min 方法针对不同的参数类型进行了重载。