如何使 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.
中的 Object
s
您可以从基元数组创建流,然后从流创建对象数组。这是一个例子。
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.abs
、java.lang.Math.max
和 java.lang.Math.min
方法针对不同的参数类型进行了重载。
我想写一个简单的方法来打印一个数组 - 看起来像一个数组 - 及其在终端中的元素,而不管它是否是 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.
Object
s
您可以从基元数组创建流,然后从流创建对象数组。这是一个例子。
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.abs
、java.lang.Math.max
和 java.lang.Math.min
方法针对不同的参数类型进行了重载。