【问题标题】:Legacy array notation not allowed on variable-arity parameter可变参数参数上不允许使用旧数组表示法
【发布时间】:2017-07-28 13:42:29
【问题描述】:

我是出于好奇而问这个问题,因为我没有在 StackOverflow 上找到有关此特定编译错误的问题:

可变参数参数上不允许使用旧数组表示法

在看到一些包含这样签名的代码时,我遇到了遗留符号:

private void a(int ints[]){/*...*/}

所以我玩了一会儿,直到遇到以下示例中的编译错误。

// this method compiles as expected
private void method1(int[][] ints){ /*...*/ }

// this too
private void method2(int[]... ints){ /*...*/ }

// this does to, but makes use of legacy array notation
private void method3(int ints[][]){ /*...*/ }

// this still does, even when mixing up the notations
private void method4(int[] ints[]){ /*...*/ }

// this however fails to compile
private void method5(int... ints[]){ /*...*/ }

语言设计者决定以这种方式实现它是否有特定原因?不允许使用旧数组表示法的可变参数?

注意:我理解遗留符号

【问题讨论】:

    标签: java arrays java-8 variadic-functions


    【解决方案1】:

    int[] aint a[] 是同一个东西,

    所以 1 ,3 和 4 是等价的。

    在 2 中,您基本上是在说“我想要一个 int[] 类型的可变参数”

    所以它可以被称为method2(new int[]{},new int[]{})

    在5中,int..告诉编译器它是一个int类型的vararg,参数的名字被取为ints[],这是一个无效的变量名。

    【讨论】:

    • 好吧,似乎没有其他原因。我的意思是,如果你在最后一个方法参数名称中去掉[],它就可以工作。
    • @Lino ... 是一种特殊的语法糖,编译器通过查看...之前的内容来决定类型。所以,它与其他数组声明不同。
    • 我没试过,你可以通过javap查看,
    【解决方案2】:

    我不知道为什么他们决定这样做*,但是,我想确认这是规范的正式部分,完全旨在产生一个编译 -时间错误:

    使用混合数组表示法是编译时错误 (§10.2) 对于可变参数。

    来自JLS 8.4.1

    *这个问题是基于意见的,因为除了 Java 语言设计者之外没有人可以告诉你。如果我要推测的话,很可能是因为一开始就允许使用多个符号是一个坏主意。

    【讨论】:

    • @Lino 这是当今 Java 的主要问题。太多的包袱保持向后兼容性。像 Kotlin 这样的东西似乎是未来!
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多