资源:
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中已经更改为使用它的所有旧代码仍然可以编译和工作而无需修改.
类型参数String[]应显式转换Object[]为从 TestVarArgs 类型调用 varargs 方法varArgsMethod(Object...)。或者可以将其强制转换为对象以进行可变参数调用
您可以通过执行以下任一方式来修复它:如果将强制转换String[]为Object[](ref tva.varArgsMethod((Object[])args);:)
或
将方法的参数更改为String[]
(ref public void varArgsMethod(String ... paramArr):)