解释警告:最后一个参数的参数类型不准确的非变量调用varargs方法



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

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)

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

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

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

为了向后兼容,编译器假设是前者,并发出警告而不是错误,但它仍然要求您插入对ObjectObject[]的强制转换,以在源代码中说明您的真正意思。

最新更新