2

以下代码在 Java 中编译良好:

public static void main(String[] args) {
    int i =5;
    call(i);
}


static void call(int i){
    System.out.println("int");
}

static void call(long i){
    System.out.println("long");
}

static void call(Integer i){
    System.out.println("Integer");
}


static void call(Object i){
    System.out.println("Object");
}

但是下面的代码给出了编译时错误:

public static void main(String[] args) {
    int i =5;
    call(i);
 }


static void call(int... i){
    System.out.println("int...");
}

static void call(long... i){
    System.out.println("long...");
}

static void call(Integer... i){
    System.out.println("Integer...");
}


static void call(Object... i){
    System.out.println("Object...");
}

为什么 Java 在使用 var-args 时不维护类似的调用机制?在第二个示例中,调用应该转到方法static void call(int... i)

4

4 回答 4

1

这里是答案

Java 不适用于重载可变参数方法。

以下是 Specs 提供的内容:

那么什么时候应该使用可变参数呢?作为客户端,只要 API 提供它们,您就应该利用它们。核心 API 中的重要用途包括反射、消息格式化和新的 printf 工具。作为 API 设计人员,您应该谨慎使用它们,只有当其好处真正令人信服时。一般来说,您不应该重载可变参数方法,否则程序员将很难弄清楚调用了哪个重载。

于 2013-04-30T06:08:28.410 回答
0

由于您将该方法声明为 Static void call(int... i) 并且该方法需要 int 数组,但在调用此方法时您只发送一个整数值。

Static void call(int... i) is Same as Static void call(int[] i)
于 2013-04-30T05:37:17.667 回答
-1

@NilsH 给出的链接清楚地解释了原因。请在 http://www.xyzws.com/Javafaq/why-overloading-a-varargs-method-doesnt-work-for-the-primitive-type-and-its-object-wrapper-type/50找到详细信息

于 2013-05-04T19:50:06.593 回答
-1

变量参数在 java 中被视为数组。因此,不要传递 int 值,而是像传递数组一样传递它。例如。

int[] i ={5};
call(i);
于 2013-04-30T05:48:39.950 回答