有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

单个Java变量可以接受原语或对象数组吗?

例如,对于读取数组元素的单个方法,程序员如何允许对象数组或原语数组作为参数传递Object[] arrayName只接受对象数组,泛型变量不接受原语。有没有一种方法可以在不重载方法的情况下接受任意一种类型的数组


共 (6) 个答案

  1. # 1 楼答案

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

    编辑:是的,您可以使用Object作为参数类型,但在使用它之前,您需要跳转(反射或大量类型转换)。您必须处理这样一种情况,即传递的东西根本不是数组

    OP的目标是找到一种比重载更好的类型。依我看,使用Object作为claytons数组类型显然无法实现这一目标。它需要更复杂的代码,效率更低,并且更容易出现意外的运行时类型错误

  2. # 2 楼答案

    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. 三,

    因此,即使使用自动装箱,对象数组也不能采用primitves,因为数组本身是从对象派生的。因此,我的答案是否定的

    然而,在C#中,您可以使用神奇的“var”来解决这个问题:)

  3. # 3 楼答案

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

    从那里,你必须使用反射。特别是^{}^{}^{}将告诉该方法已传递的内容。这是原始数据类型引入的一些不幸的不整洁

  4. # 4 楼答案

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

  5. # 5 楼答案

    背景是什么

    您的情况可能需要泛型,您可以根据自己的意愿传入Collection<Integer>Collection<SomeOtherType>

  6. # 6 楼答案

    有点不同的方法,您考虑过autoboxingvarargs的组合吗?但是,这需要在更高级别中进行更改,因此您必须传入1, 2, 3,而不是传递int[] {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) {
            // ...
        }
    }