为什么我在这里得到一个编译警告(用Java中的var args方法调用)

Ank*_*wal 48 java

资源:

public class TestVarArgs {
  public void varArgsMethod(Object ... arr) {
     System.out.println(arr.getClass().getName());
     for(Object o : arr) {
       System.out.println(o);
     }
  }

  public static void main(String[] args) {
    TestVarArgs tva = new TestVarArgs();
    tva.varArgsMethod(args);    
  }
}
Run Code Online (Sandbox Code Playgroud)

编译:

javac TestVarArgs.java 
Run Code Online (Sandbox Code Playgroud)

错误:

TestVarArgs.java:15: warning: non-varargs call of varargs method with inexact argument type for last parameter;
cast to java.lang.Object for a varargs call
cast to java.lang.Object[] for a non-varargs call and to suppress this warning    
tva.varArgsMethod(args);     
^

1 warning
Run Code Online (Sandbox Code Playgroud)

我正在使用javac 1.6.0_20,代码o/p表示无论如何都进行了非var arg调用.

Thi*_*ilo 78

这是因为String[]Object...没有完全匹配.

您必须首先String[]转换为Object[](如果要将字符串作为单独的参数传递)或Object(如果您只想要一个参数是数组).

 tva.varArgsMethod((Object[])args);    // you probably want that

 tva.varArgsMethod( (Object) args);    // you probably don't want that, but who knows?
Run Code Online (Sandbox Code Playgroud)

为什么这是警告而不是错误?向后兼容性.在引入varargs之前,您已经使用了这些方法Object[]并且编译了代码,并且在将方法升级为使用varargs之后仍然应该以相同的方式工作.JDK标准库充满了类似的案例.例如java.util.Arrays.asList(Object[]),java.util.Arrays.asList(Object...)在Java5中已经更改为使用它的所有旧代码仍然可以编译和工作而无需修改.


Fre*_*eak 6

类型参数String[]应显式转换Object[]为从 TestVarArgs 类型调用 varargs 方法varArgsMethod(Object...)。或者可以将其强制转换为对象以进行可变参数调用
您可以通过执行以下任一方式来修复它:如果将强制转换String[]Object[](ref tva.varArgsMethod((Object[])args);:)

将方法的参数更改为String[]
(ref public void varArgsMethod(String ... paramArr):)

  • @abc 请注意这句话。`String[] 类型的参数应该显式转换为 Object[],以用于`**`调用可变参数方法 varArgsMethod(Object...)`** 和第二行 `It或者可以转换为对象以进行` **`可变参数调用`** 所以一开始我说只是为了方法调用,第二次我说是为了可变参数调用。但是我同意你反对我的观点,我应该更准确地解释它;) (2认同)