例如,对于读取数组元素的单个方法,程序员如何允许将对象数组或基元数组作为参数传递? Object[] arrayName
只接受一个Object数组,而泛型变量不接受原语。有没有办法接受任何类型的数组而不重载方法?
答案 0 :(得分:11)
您可以将任一类型的数组作为Object
传递。
从那里,你必须使用反射。特别是isArray()
,getComponentType()
和isPrimitive()
会告诉方法传递了什么。这是原始数据类型引入的一些不幸的不整洁。
答案 1 :(得分:6)
Object[]
和(例如)int[]
的唯一常见超类型是Object
。所以你的问题的答案是“不”。
编辑:是的,你可以使用Object
作为参数类型,但是你需要在使用它之前跳过箍(反射或许多类型转换)。你必须处理传递的东西根本不是数组的情况。
OP的目标是找到比重载更好的单一类型。使用Object
作为claytons阵列类型的IMO显然不符合这一目标。它需要更复杂的代码,效率更低,更容易受到意外的运行时类型错误的影响。
答案 2 :(得分:2)
在java中,所有原始类型都有对象包装器。例如。 Integer
的{{1}},int
的{{1}}等。如果您愿意接受一组对象包装器,那么让您的方法接受Boolean
应该有效对你而言。
答案 3 :(得分:1)
背景是什么?
您的情况可能需要使用仿制药,您可以随意传递Collection<Integer>
或Collection<SomeOtherType>
。
答案 4 :(得分:0)
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);
}
}
输出: 你好 世界 1 2 3
因此,即使使用自动装箱,对象数组也不能使用原始数据,因为数组本身是从Object派生的。因此,我对这个问题的回答是否定的。
但是,在C#中你可以使用神奇的“var”解决这个问题:)
答案 5 :(得分:0)
有点不同的方法,您考虑过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) {
// ...
}
}