【问题标题】:why is not possible to take the multiple numbers of variable argument parameter in a method? [duplicate]为什么不能在方法中采用多个可变参数参数? [复制]
【发布时间】:2013-10-04 19:11:16
【问题描述】:
class test {
    public static void m1(int...x,double...y) {
        /* some code here */
    }  

     public static void main(String args[]){
         m1();
         m1(10,20,3.5);
         m1(20,2.5,3.5,4.5);
     }
}

每当我们使用一种方法时,它只需要一个变量,主要是在方法签名的末尾。为什么会这样?

为什么我们不能使用多个可变长度参数?我正在从编译器的角度寻找答案。

【问题讨论】:

  • 如何区分这两个列表?
  • 是的,您不能使用多个可变长度参数,并且它应该始终是列表中的最后一个。
  • 第一个可变参数在哪里结束,第二个从哪里开始?没有更多信息,您无法区分这两个列表。在这些情况下,最好选择两个数组。
  • 所以第二个m1 调用应该传递一个int 和两个double 参数,对吧?随着20 自动从整数转换为double

标签: java compiler-construction jvm


【解决方案1】:

如果两个变量类型相同会怎样:

public static void m1(int...x, int...y) {

编译器应该在哪里拆分xy 之间的输入参数?我也不知道。编译器必须不允许这样做,因为没有好的方法来处理它。

可变arity(“varargs”)参数必须位于方法签名的末尾,以便编译器可以判断哪些参数映射到哪些形式参数。任何超出固定参数的参数都会发送到表示可变参数的数组。

JLS, Section 8.4.1 说:

方法或构造函数的最后一个形参很特殊:它 可能是一个可变参数,由后面的省略号表示 类型。

由于上述原因,它在 JLS 和编译器中被强制执行。

【讨论】:

    【解决方案2】:

    简而言之,没有you can't use more than one variable signature

    【讨论】:

    • 不是问题吗,为什么? OP 已经知道它是不允许的,它必须作为最后一个参数出现。
    【解决方案3】:

    我的意思是,只要可变参数周围的参数类型不同,编译器就没有理由不能这样做。毕竟,它本质上只是将参数放入数组的语法糖。

    但从语言设计的角度来看,它可能只会导致更多的混乱/问题而不是其价值。

    【讨论】:

      【解决方案4】:

      varargs 只能用在方法参数的末尾。你不能有两个可变参数。

      编译器不能单独用逗号匹配参数和参数..

      【讨论】:

      • OP 已经知道它是不允许的并且它必须作为最后一个参数出现。你的答案在哪里?!
      • 编译器不能单独用逗号匹配参数和参数
      • 你不应该在你的回答中提到它是什么,而不是在这里的 cmets?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多