这是我的示例代码,我收到警告。
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);
答案 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)
在字节码级别,方法签名有两个类型String
和Object[]
的参数,但是在幕后编译器会为您创建数组,因此您不必键入{{ 1}}。您仍然可以使用new Object[] {first, last}
显式创建数组,编译器会很高兴。
但是,当您将一个字符串数组作为最后一个参数传递时,有两种可能的解释:
format("Hello", new Object[]{})
format("Hello", new String[] {first, last})
为了向后兼容,编译器假定前者并发出警告而不是错误,但它仍然要求您向format("Hello", new Object[]{new String[] {first, last}})
或Object
插入强制转换以在源代码中说明你的意思是。