【问题标题】:Why passing {a, b, c} to a method doesn't work?为什么将 {a, b, c} 传递给方法不起作用?
【发布时间】:2010-11-04 06:53:06
【问题描述】:

我尝试将初始化列表 {...} 传递给构造函数,但没有成功。 当我改为在方法局部变量 (int[]) 中声明它时,它完美地工作。

这是为什么呢?

public class QuickSort {
    int[] a;

    public QuickSort(int[] a) {
        this.a = a;
    }

    public static void main(String[] args) {
        // ###################
        // ###    WORKS     ##
        // ###################
        int[] a = {8,12,79,12,50,44,8,0,7,289,1};
        QuickSort sort = new QuickSort(a);

        // ###################
        // ### DOESN'T WORK ##
        // ###################
        //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
    }
}

【问题讨论】:

  • 碰巧的是,可变参数语言特性(如 java.util.Arrays.asList)最初就是这样做的。改变它可能是一个错误......

标签: java arrays syntax array-initialization


【解决方案1】:

当声明 int[] 并分配 {1, 2, 3} 时,编译器知道您想要创建一个 int[],因为它在那里被拼写出来。

在后一种情况下,您将数组直接粘贴到方法调用中,您将不得不使用

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

告诉编译器你的数组是什么。

【讨论】:

    【解决方案2】:

    {} 构造称为数组初始化器,它用于在 Java 中初始化数组。 (参考:Section 10.6: Array Initializers 来自The Java Language Specification, Third Edition。)

    之所以传递{1, 2, 3}本身无效,是因为没有与初始化器关联的类型信息。

    因此,必须通过编写new Type[] 让编译器知道数组的类型,其中Type 是数组所针对的类型。

    以下都是数组初始值设定项的有效用法:

    • new String[] {"Hello, "World"}
    • new Character[] {'A', 'B'}
    • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

    可以看出,这种表示法可用于许多数据类型,因此它不是整数专用的。

    至于:

    int[] a = {1, 2, 3};
    

    上面之所以有效是因为在变量类型声明中向编译器提供了类型信息,在本例中为int[]。上面的意思是:

    int[] a = new int[] {1, 2, 3};
    

    现在,如果我们有 new int[] {1, 2, 3},我们就可以创建一个新的 int[] 数组,这样就可以像处理任何其他 int[] 数组一样处理它——只是它没有与之关联的变量名。

    因此,new int[] {1, 2, 3} 创建的数组可以发送到以int[] 作为参数的方法或构造函数中:

    new Quicksort(new int[] {1, 2, 3});  // This will work.
    

    【讨论】:

      【解决方案3】:

      花括号(在数组字面量中使用时)只能在声明数组时使用:)

      【讨论】:

        【解决方案4】:

        你也可以这样做:

        public class QuickSort {
            int[] a;
        
            public QuickSort(int ... a) {
                this.a = a;
            }
        
            public static void main(String[] args) {
        
                QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
            }
        }
        

        【讨论】:

        • 非常好!我会用这个。
        【解决方案5】:

        Java 并没有真正的类型推断。数组变量声明是 Java 语言规范中的 special case,不适用于方法参数。这样做是可能的,但会给规范增加很多复杂性,因为它必须处理诸如 {"a", "b"} 是否创建 String[] 或 Object[] 之类的问题 - 在这里看起来很明显,但是如果它是复杂类型层次结构中的对象呢?如果方法被重载并且两个版本都存在怎么办?

        【讨论】:

          【解决方案6】:

          这可能是因为您的初始化列表没有输入信息。 试试这个:

          QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
          

          【讨论】:

            【解决方案7】:

            在将列表传递给构造函数之前,您是否尝试过将列表强制转换为 int[]?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-10-12
              • 2019-10-27
              • 2015-10-02
              • 1970-01-01
              • 1970-01-01
              • 2018-11-10
              • 1970-01-01
              相关资源
              最近更新 更多