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

时间:2009-12-12 06:53:23

标签: java arrays

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

6 个答案:

答案 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)

有点不同的方法,您考虑过autoboxingvarargs的组合吗?但是,这需要更高级别的更改,因此您不必传递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) {
        // ...
    }
}