在处理可变长度参数时,我之前没有看到过什么特别的东西
例如,有一个名为prepared statement的方法,带有声明,使得
1。
String prepareStatement(String... columnNames,String... values)
//String... columnNames(Eclipse shows error saying The variable argument type String of the method prepareStatement must be the last parameter)
2. 另一个方法声明
String prepareStatement(int i,String... columnNames,String... values)
//still the same result as above(The variable ...... parameter)
为什么Java不允许使用多个可变长度参数?还有其他方法可以做到吗?
PS:这样做的原因是我的要求是为传递的参数生成通用的准备好的语句,因为所有此参数都将通过属性传递
仅允许最后一个参数为可变长度:
String prepareStatement(String[] columnNames, String... values)
String …等于String [],因此在这种情况下,您可以为第一个参数插入String [],然后检查它是否为空或有多长。
编辑到您的编辑
如果您确实需要所有字符串作为参数的输入,我建议定义一个真正不常见的字符串来分隔您的输入:
static String prepareStatement(String... params)
{
String ret = "";
boolean valueInput = false;
for(String s : params)
{
if(s.equals("MyReallyUncommonSeperateString"))
{
valueInput = true;
ret+="\nvalues\n";//visual delimiter of columnNames and Values
}
else if(valueInput)
{
//handling of your value inputs
ret+=s; //example handling, concatenate everything
}
else
{
//handling of your columnnames
ret+=s; //example handling, concatenate everything
}
}
return ret;
}
您可以称之为:
System.out.println(prepareStatement("a","b","c","d","e","MyReallyUncommonSeperateString","f","g","h","i","j","k"));
输出:
abcde
values
fghijk
另一种方法是也将columnNames的长度作为参数:
static String prepareStatement(int length, String... params)
{
String ret = "";
for(int i = 0; i < length; i++){
//handling of columnnames
String colName = params[i];
//do something with colName
ret+=colName; //example handling, concatenate everything
}
ret+="\nvalues\n";//visual delimiter of columnNames ans Values
for(int i = length; i < params.length; i++){
String value = params[i];
//do something with values
ret+=value; //example handling, concatenate everything
}
return ret;
}
致电:
System.out.println(prepareStatement(5, "a","b","c","d","e","f","g","h","i","j","k"));
和相同的输出:
abcde
values
fghijk
如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。 func myFunc(a, b, arg ...int) {} 这个函数接受一个类似某个类型的 slice 的参数(详见第 7 章),该参数可以通过第 5.4.4 节中提到的 for 循环结构迭代。 示例函数和调用: func Greeting(prefix
支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数。 package main import "fmt" // 这个函数可以传入任意数量的整型参数 func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums {
问题内容: 我正在参加本地社区大学的数据结构和算法课程,很有趣。该课程的教科书是Y. Daniel Liang的 Java编程简介,第10版 。这本书本身很扎实。 在处理中,Liang提到了Java的“可变长度”参数。他写道(第265页): Java将可变长度参数视为数组。您可以将数组或可变数量的参数传递给可变长度参数。当调用带有可变数量参数的方法时,Java创建一个数组并将参数传递给它。 一个例
问题内容: 据我了解,一个由固定数量的元素组成,一个与您传递(相同类型)的参数数量一样多。但是他们是一样的吗?我可以通过一个期望的地方吗? 问题答案: 是的,如果您有一个带有varargs参数的方法,例如: 您这样称呼它: 然后编译器将其转换为: 参数的类型为,可以像其他数组变量一样使用。请注意,它 可能 仍然是: 有关更多信息,请参见varargs的文档。 但这 并不 意味着可变参数与阵列互换-
问题内容: 我正在为命令行应用程序做前端。它很长。命令行与此类似: 在我将“模式”开关添加到其中之前,一切似乎都可以正常工作。“模式”开关从命令行执行。我尝试了几种组合方法,将参数拆分为既不执行也不执行的数组。我认为这与“模式”不相关,因为它前面没有,也不能有。 我究竟做错了什么? 编辑:我忘了提到我所能看到的是:调试器停止在不可编译的源代码上。我正在使用netbeans,它似乎无法打印出堆栈跟踪
问题内容: “重要的是要理解,引用变量的类型(而不是它所引用的对象的类型)决定了可以访问哪些成员。” 那句话你到底是什么意思?这仅限于继承概念吗?JVM如何处理它? 问题答案: 这意味着假设您具有: 的类型的 变量 是,但对象的类型是指是。这是变量类型,它决定了您可以执行的操作-因此您无法调用 编译器仅知道您在上调用方法,其中不包括。同样,重载方法仅针对您所知道的方法进行解析: