这是我的示例代码,我得到的警告。
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的可变参数调用[]对于非变量调用,并抑制此警告
lsNewSQL = MessageFormat.format(lsNewSQL,foSubstitutionArray);
您没有显示foSubstitutionArray
的类型,但我假设它是一个非对象类型的数组。
现在,MessageFormat.Format()
是一个变量方法,这意味着您可以向它传递任意数量的参数(好吧,至少1个),Java将在内部将它们全部收集到一个对象数组中。但是,这里传入的是一个数组,因此Java会感到困惑:您是试图传递单个参数(恰好是一个数组),还是传入变量参数?
如果你想传递一个参数(不太可能),给Object:
添加强制类型转换MessageFormat.format(lsNewSql, (Object) foSubstitutionArray)
如果你想从数组中获取值,强制转换为Object[]:
MessageFormat.format(lsNewSql, (Object[]) foSubstitutionArray)
MessageFormat.format()
有一个可变性签名,这对程序员来说是一个方便,允许一个人写
-
format("Hello")
-
format("Hello {0}", name)
-
format("Hello {0} {1}", first, last)
在字节码级别,方法签名有两个类型为String
和Object[]
的参数,但在幕后,编译器为您创建数组,因此您不必键入new Object[] {first, last}
。您仍然可以使用format("Hello", new Object[]{})
显式地创建数组,并且编译器会很高兴。
但是,当您将字符串数组作为最后一个参数传递时,有两种可能的解释:
-
format("Hello", new String[] {first, last})
-
format("Hello", new Object[]{new String[] {first, last}})
为了向后兼容,编译器假设是前者,并发出警告而不是错误,但它仍然要求您插入对Object
或Object[]
的强制转换,以在源代码中说明您的真正意思。