解释警告:非varargs调用varargs方法,并为最后一个参数

时间:2015-08-28 16:19:09

标签: java

这是我的示例代码,我收到警告。

String lsSQL = foMetaQuery.getSQL();
String  lsNewSQL = replace(lsSQL,"'' {","''{");
lsNewSQL = replace(lsNewSQL," } ''","}''");
lsNewSQL = replace(lsNewSQL," }","}");
lsNewSQL  = MessageFormat.format(lsNewSQL,foSubstitutionArray);
loVSQueryDef.setSQL(lsNewSQL);

编译器说

  

强制转换为java.lang.Object以进行varargs调用强制转换为java.lang.Object []   对于非varargs调用并禁止此警告

lsNewSQL  = MessageFormat.format(lsNewSQL,foSubstitutionArray);

2 个答案:

答案 0 :(得分:9)

您不会显示foSubstitutionArray的类型,但我认为它是一个非Object类型的数组。

现在,MessageFormat.Format()是一个varargs方法,这意味着你可以传递任意数量的参数(好吧,至少1个),Java将在内部将它们全部收集在一个对象数组中。但是,在这里你传入一个数组,所以Java变得困惑:你是试图传递一个参数(恰好是一个数组),还是你传入变量参数?

如果您打算传递一个参数(不太可能),请向对象添加一个强制转换:

MessageFormat.format(lsNewSql, (Object) foSubstitutionArray)

如果您打算从数组中取值,则转换为Object []:

MessageFormat.format(lsNewSql, (Object[]) foSubstitutionArray)

答案 1 :(得分:1)

MessageFormat.format()有一个 variable-arity 签名,方便程序员使用,可以编写

  • format("Hello")
  • format("Hello {name}", name)
  • format("Hello {first} {last}", first, last)

在字节码级别,方法签名有两个类型StringObject[]的参数,但是在幕后编译器会为您创建数组,因此您不必键入{{ 1}}。您仍然可以使用new Object[] {first, last}显式创建数组,编译器会很高兴。

但是,当您将一个字符串数组作为最后一个参数传递时,有两种可能的解释:

  • format("Hello", new Object[]{})
  • format("Hello", new String[] {first, last})

为了向后兼容,编译器假定前者并发出警告而不是错误,但它仍然要求您向format("Hello", new Object[]{new String[] {first, last}})Object插入强制转换以在源代码中说明你的意思是。