为什么一个方法中不能接受多个可变参数参数? [重复]

问题描述 投票:0回答:4
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);
     }
}

每当我们使用一种方法时,它只需要一个变量,大部分位于方法签名的末尾。为什么会出现这种情况?

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

java jvm
4个回答
3
投票

如果两个变量类型相同怎么办:

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

编译器应该在哪里分割

x
y
之间的输入参数? 我也不知道。 编译器必须不允许这样做,因为没有好的方法来处理它。

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

JLS,第 8.4.1 节 说:

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

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


2
投票

简而言之,答案是,不

you can't use more than one variable signature


1
投票

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

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


0
投票

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

编译器无法仅使用逗号来匹配参数和形参..

© www.soinside.com 2019 - 2024. All rights reserved.