我希望能够创建一个类似于以下的函数:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
这里的问题是args
在方法myFormat
中被当作Object[]
,因此是String.format
的单个参数,而我希望args
中的每个Object
都作为新参数传递。由于String.format
也是一个具有可变参数的方法,因此这应该是可能的。
如果这是不可能的,有没有像String.format(String format, Object[] args)
这样的方法?在这种情况下,我可以使用一个新数组将extraVar
前置到args
,并将其传递给该方法。
6条答案
按热度按时间wswtfjt71#
是的,
T...
只是T[]
的语法糖。JLS 8.4.1格式参数
列表中的最后一个形参是特殊的;它可以是 variable arity 参数,由type后面的省略号指示。
如果最后一个形式参数是
T
类型的变量arity参数,则认为定义了T[]
类型的形式参数。因此,该方法是一个 * 变量 * 方法。否则,它是一个 * 固定参数 * 方法。变量方法的调用可以包含比形参更多的实际实参表达式。所有与变量arity参数之前的形参不对应的实际参数表达式都将被计算,结果存储到一个数组中,该数组将被传递给方法调用。这里有一个例子来说明:
是的,上面的
main
方法是有效的,因为String...
就是String[]
。此外,因为数组是协变的,所以String[]
是Object[]
,所以您也可以以任何方式调用ezFormat(args)
。参见
Varargs得到了一个:通过
null
如何解析varargs是相当复杂的,有时它会做一些让您感到惊讶的事情。
请考虑以下示例:
由于varargs的解析方式,最后一条语句使用
objs = null
调用,这当然会导致NullPointerException
使用objs.length
。如果你想给予一个varargs参数一个null
参数,你可以执行以下任一操作:相关问题
以下是人们在处理varargs时提出的一些问题的示例:
Vararg得到了#2:添加额外的参数
正如你所发现的,以下内容并不“有效”:
由于varargs的工作方式,
ezFormat
实际上有两个参数,第一个是String[]
,第二个是String
。如果你要传递一个数组给varargs,你希望它的元素被识别为单独的参数,你还需要添加一个额外的参数,那么你别无选择,只能创建 * 另一个数组 * 来容纳额外的元素。以下是一些有用的helper方法:
现在,您可以执行以下操作:
Varargs得到了3:传递基元数组
它不“工作”:
Varargs只适用于引用类型。自动装箱不适用于基元数组。以下工程:
fgw7neuy2#
variadic方法
function(Object... args)
* 的底层类型是 *function(Object[] args)
。Sun以这种方式添加了varargs以保持向后兼容性。因此,您应该能够将
extraVar
前置到args
并调用String.format(format, args)
。gajydyqb3#
传递一个数组是可以的--实际上它的作用是一样的
与
它只是语法糖-编译器将第一个转换为第二个,因为底层方法需要vararg参数的数组。
看
hmmo2u0o4#
jasonmp85正确地将不同的数组传递给
String.format
。数组的大小一旦被构造就不能改变,所以你必须传递一个新的数组而不是修改现有的数组。gmxoilav5#
我也有同样的问题。
然后将obj作为varargs参数传递。成功了
au9on6nz6#
除了@genelubricant的#2之外-如果只读就足够了,如果你想交换一点额外的努力来获得
List
的一些便利-复制数组并 Package 它并不一定需要,加上在访问时在任意索引处注入所需的额外值,可以像这样实现: