61

资源:

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);    
  }
}

编译:

javac TestVarArgs.java 

错误:

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

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

4

5 回答 5

100

这是因为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?

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

于 2013-07-16T03:36:43.547 回答
5

类型的参数String[]应该显式地转换为从类型 TestVarArgsObject[]调用可变参数方法。varArgsMethod(Object...)也可以将其转换为 Object 以进行可变参数调用
您可以通过以下任一方式修复它如果您将其String[]转换为Object[](ref:)tva.varArgsMethod((Object[])args);

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

于 2013-07-16T03:37:57.730 回答
0

修改方法为

public void varArgsMethod(String ... arr)
于 2013-07-16T03:36:54.037 回答
0

对 Object 和 Object[] 的强制转换对我来说不起作用,它破坏了我的代码,导致“遇到数组值参数绑定,但期待 [java.lang.String (n/a)]”和其他随机性。

我显示警告 (subj) 的行如下,其中 filter.getStates() 的类型为 String[]

p.add(root.join(DeviceEntity_.state, JoinType.LEFT).get(ClassifierEntity_.CODE).in(filter.getStates()));

有效的解决方案是使用 Arrays.asList(filter.getStates()) 而不是强制转换。祝你好运!

于 2020-11-09T22:04:37.390 回答
-3

摆脱此警告的一种优雅方法:而不是 显式tva.varArgsMethod(args) 调用 tva.varArgsMethod(Arrays.stream(args).toArray()) 显示您传递了多个参数。摆脱警告的另一种方法是使用以下调用:

tva.varArgsMethod(Arrays.asList(args).toArray())

无论如何,我们必须将 args 转换为 Array。

于 2017-10-25T11:40:33.743 回答