Java 如何转发参数列表
我已经声明了一个接口Java 如何转发参数列表,java,parameter-passing,variadic-functions,Java,Parameter Passing,Variadic Functions,我已经声明了一个接口Listable,一个包含Listable的节点,以及一个包含节点的singlelinkedlist。SinglyLinkedList包含一个search()方法,该方法使用Listable中的方法matches()。我希望Listable尽可能通用,因此matches()中的参数数量应该是任意的。 search()返回一个新的SingleLinkedList,其中只包含与之匹配的此元素 请看以下实现: interface Listable { // ...
Listable
,一个包含Listable
的节点,以及一个包含节点的singlelinkedlist
。SinglyLinkedList
包含一个search()
方法,该方法使用Listable
中的方法matches()
。我希望Listable
尽可能通用,因此matches()
中的参数数量应该是任意的。
search()
返回一个新的SingleLinkedList
,其中只包含与之匹配的此
元素
请看以下实现:
interface Listable {
// ...
boolean matches(Object... matchesArgs);
// ...
}
class Node {
Listable data;
Node next;
}
class SinglyLinkedList {
// ...
public SinglyLinkedList search(Object... searchArgs) {
// ...
somewhere: [someNode].data.matches(searchArgs)
// ...
}
// ...
}
这不起作用,因为matchesArgs
只有一个元素:数组searchArgs
。我希望它等于searchArgs
,而不是[searchArgs]
我不想在matches()
的实现中解包数组,因为无论何时使用matches()
,都需要传递一个参数数组,而且它还试图处理未创建的问题
在我看来,问题是searchArgs
在转发到matches()
时被打包到另一个数组中。我希望将其元素作为参数传递,而不是传递这个数组
有没有一种在Java中实现这一点的方法
这需要在使用matches()时传递一个参数数组
但是您在方法的签名中指定,它接受可变长度的数组。在调用代码时,没有任何东西会阻止您传递一个或一些值。在matches方法中,它将是一个数组
这需要在使用matches()时传递一个参数数组
但是您在方法的签名中指定,它接受可变长度的数组。在调用代码时,没有任何东西会阻止您传递一个或一些值。在matches方法内部,它将是一个数组我不确定将searchArgs
作为参数传递给matches
是否会导致该参数被另一个数组包装。以以下示例代码为例:
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
doThat(1, 2, 3, 4, 5);
}
public static void doThat(Object... varargs) {
doThis(varargs);
}
public static void doThis(Object... varargs) {
System.out.println(Arrays.toString(varargs));
}
}
输出是预期的[1,2,3,4,5]
我不确定将searchArgs
作为参数传递给匹配的是否会导致另一个数组包装该参数。以以下示例代码为例:
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
doThat(1, 2, 3, 4, 5);
}
public static void doThat(Object... varargs) {
doThis(varargs);
}
public static void doThis(Object... varargs) {
System.out.println(Arrays.toString(varargs));
}
}
输出是预期的[1,2,3,4,5]
据我所知,您的问题可以简化为:
public class HelloWorld {
public static void main(String[] args) {
test(1, 2, 3);
test(new Integer [] {1, 2, 3});
}
public static void test(Object... args) {
System.out.println("Length: " + args.length);
}
}
此代码发出以下警告:
警告:最后一个参数的varargs方法的非varargs调用具有不精确的参数类型
问题很清楚。Java无法决定数组是分散还是作为第一个参数传递
您可以使用适当的类型来解决此问题
public class HelloWorld {
public static void main(String[] args) {
test(1, 2, 3);
test(new Integer [] {1, 2, 3});
}
// here!
public static void test(Integer... args) {
System.out.println("Length: " + args.length);
}
}
现在这段代码没有歧义,编译得很好。输出为:
Length: 3
Length: 3
您应该充分利用类型系统。据我所知,您的问题可以归结为:
public class HelloWorld {
public static void main(String[] args) {
test(1, 2, 3);
test(new Integer [] {1, 2, 3});
}
public static void test(Object... args) {
System.out.println("Length: " + args.length);
}
}
此代码发出以下警告:
警告:最后一个参数的varargs方法的非varargs调用具有不精确的参数类型
问题很清楚。Java无法决定数组是分散还是作为第一个参数传递
您可以使用适当的类型来解决此问题
public class HelloWorld {
public static void main(String[] args) {
test(1, 2, 3);
test(new Integer [] {1, 2, 3});
}
// here!
public static void test(Integer... args) {
System.out.println("Length: " + args.length);
}
}
现在这段代码没有歧义,编译得很好。输出为:
Length: 3
Length: 3
你应该充分利用打字系统。我已经编辑了这个问题,使问题更清楚。。。我知道matchesArgs
是一个数组,但问题是,它只有一个元素:数组searchArgs
。我希望它等于searchArgs
。我已经编辑了这个问题以使问题更清楚。。。我知道matchesArgs
是一个数组,但问题是,它只有一个元素:数组searchArgs
。我希望它等于searchArgs
。您的代码会给出警告,因为它不明确。这种歧义的根源是在变量方法中使用了对象
。考虑建模你的系统,这样你的方法就不会接收到可怜的<代码>对象< /代码>类型。你的代码给出了一个警告,因为它是含糊不清的。这种歧义的根源是在变量方法中使用了对象
。考虑建模你的系统,这样你的方法就不会接收到可怜的<代码>对象< /代码>类型。你完全正确…调用search()时,我实际上忘记了一个参数。。。当我看到错误(我实现了一些异常匹配)时,我立即想到了所描述的问题,而不是在首先调用search()时检查我的参数。。。这很尴尬。谢谢一点也不尴尬。所有最好的与你试图代码!你完全正确。。。调用search()时,我实际上忘记了一个参数。。。当我看到错误(我实现了一些异常匹配)时,我立即想到了所描述的问题,而不是在首先调用search()时检查我的参数。。。这很尴尬。谢谢一点也不尴尬。所有最好的与你试图代码!