单个Java变量可以接受基元或对象的数组吗?

例如,对于读取数组元素的单个方法,程序员如何允许将对象数组或基元数组作为参数传递? Object[] arrayName只接受一个Object[] arrayName数组,而generics变量不接受原语。 有没有办法接受任何类型的数组而不重载方法?

您可以将任一类型的数组作为Object传递。

从那里,你必须使用reflection。 特别是isArray()getComponentType()isPrimitive()将告诉方法传递了什么。 这是原始数据类型引入的一些不幸的不整洁。

Object[]和(例如) int[]的唯一常见超类型是Object 。 所以你的问题的答案是“不”。

编辑:是的你可以使用Object作为参数类型,但你需要跳过箍(reflection或许多类型转换)才能使用它。 你必须处理传递的东西根本不是数组的情况。

OP的目标是找到比重载更好的单一类型。 使用Object作为claytons数组类型的IMO显然不符合这个目标。 它需要更复杂的代码,效率更低,更容易受到意外的运行时类型错误的影响。

在java中,所有基元类型都有对象包装器。 例如。 Integer用于intBoolean用于boolean等。如果您愿意接受一个对象包装器数组,那么让您的方法接受Object[]应该适合您。

背景是什么?

您的情况可能是调用generics,您可以根据需要传递CollectionCollection

 class Test { public static void main(String[] args) { run(new String[] {"Hello", "World"}); Integer[] inputs = {1, 2, 3}; run(inputs); //run(new int[] {1, 2, 3}); //this would not do! } private static void run(Object[] inputs) { for(Object input : inputs) System.out.println(input); } 

}

输出:Hello World 1 2 3

因此,即使使用自动装箱,对象数组也不能使用原始数据,因为数组本身是从Object派生的。 因此,我对这个问题的回答是否定的。

但是,在C#中你可以使用神奇的“var”解决这个问题:)

有点不同的方法,你考虑过autoboxing和varargs的组合吗? 然而,这需要更高级别的更改,因此您不必传递int[] {1, 2, 3} ,而是必须传入1, 2, 3 。 不确定这是否重要。

 public static void main(String... args) { doStuff("one", "two", "three"); doStuff(1, 2, 3); doStuff("one", 2, 3.3); doStuff(new String[] {"one", "two", "three"}); doStuff(new Integer[] {1, 2, 3}); doStuff(new Object[] {"one", 2, 3.3}); } public static void doStuff(Object... args) { for (Object o : args) { // ... } }