我希望能够创建一个像这样的函数:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是在方法中args处理,因此是单个参数,而我希望每个in 都作为新参数传递.既然也是一个带有变量参数的方法,这应该是可能的.Object[]myFormatString.formatObjectargsString.format
如果这是不可能的,有没有像这样的方法String.format(String format, Object[] args)?在这种情况下,我可以在前面加上extraVar到args使用新的数组,并把它传递给该方法.
我正在读这个答案,它说的是
另请注意,使用显式数组参数调用泛型vararg方法可能会默默地产生与预期不同的行为:
Run Code Online (Sandbox Code Playgroud)public <T> void foo(T... params) { ... } int[] arr = {1, 2, 3}; foo(arr); // passes an int[][] array containing a single int[] element
类似的行为在这个答案得到解释3:
Run Code Online (Sandbox Code Playgroud)int[] myNumbers = { 1, 2, 3 }; System.out.println(ezFormat(myNumbers)); // prints "[ [I@13c5982 ]"Varargs仅适用于引用类型.自动装箱不适用于基元数组.以下作品:
Run Code Online (Sandbox Code Playgroud)Integer[] myNumbers = { 1, 2, 3 }; System.out.println(ezFormat(myNumbers)); // prints "[ 1 ][ 2 ][ 3 ]"
我尝试了更简单的例子:
private static <T> void tVarargs(T ... s)
{
System.out.println("\n\ntVarargs ==========");
System.out.println(s.getClass().getName());
System.out.println(s.length);
for(T i …Run Code Online (Sandbox Code Playgroud) 在整个Google Guava库中,我注意到了使用"一(或两个)加var args"技术的倾向.
例子:
void add(T value, T... moreValueArr)void add(T value, T value2, T... moreValueArr)我花了一段时间才弄清楚原因:为了防止使用零args(第一种情况下)或一种arg(第二种情况)调用.
如果在下面的场景A和B之间做出选择,那么进一步扩展这项技术,哪个更好?我希望有深入Java知识的人可以提供洞察力.
情景A :(两种方法)
void add(T... valueArr)void add(Iterable<? extends T> iterable)情景B :(三种方法)
void add(T value, T... moreValueArr)void add(T[] valueArr)void add(Iterable<? extends T> iterable)一个想法为什么B可能更好:我注意到许多Java程序员都不知道数组可以直接作为var args传递.因此,B可能提供关于可能性的暗示.
最后,我意识到B有额外的开发,测试和维护开销.请把这些考虑放在一边.
这个问题是我原来问题的一个微妙变化:Java varags方法参数列表与数组
当我们在main方法和String中编写String [] a时有什么区别?a?
public static void main(String[]a)
Run Code Online (Sandbox Code Playgroud)
和
public static void main(String...a)
Run Code Online (Sandbox Code Playgroud) 如何将数组作为三个参数传递给Java中的函数?(原谅我,我对Java很新).
我有以下函数float r, float g, float b, float a作为参数.
renderer.prepare(r, g, b, 1);
Run Code Online (Sandbox Code Playgroud)
我想传递这个函数的输出.(或者弄清楚如何返回三个单独的解压缩浮点数).
public static float[] rgbToFloat(int r, int g, int b) {
return new float[] {(float) r / 255f, (float) g / 255f, (float) b / 255f};
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?在其他一些语言中,它看起来像这样:
renderer.prepare(...rgbToFloat(25, 60, 245), 1);
Run Code Online (Sandbox Code Playgroud) 我曾尝试使用data和data1变量。它总是调用String ... data。那么,java中的String[]数据和String...数据有什么区别呢?
public class ArrayTest {
public static void main(String[] args) {
ArrayTest arrayTest = new ArrayTest();
// Option one
String[] data = {"A", "B", "C"};
// Option two
String data1 = "A";
arrayTest.test(data);
}
public void test(String[] ... data ) {
System.out.println("---From: String[] ... data---");
for(String[] item: data) {
for(String innerItem : item) {
System.out.println(innerItem);
}
}
}
public void test(String ... data ) {
System.out.println("---From: String …Run Code Online (Sandbox Code Playgroud)