我已经声明了一个接口Listable
,包含Listable
的Node
和包含节点的SinglyLinkedList
。SinglyLinkedList
包含一个search()
方法,该方法利用Listable
中的方法matches()
。我想让Listable
尽可能一般,因此matches()
中的参数量应该是任意的。 search()
返回一个新的SinglyLinkedList
,仅包含匹配的this
的元素。
查看以下实现:
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中进行此操作?
我不确定将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]
。
每当您使用Matches()
时,这都需要通过一系列参数
,但是您在该方法的签名中指定,它接受可变长度的数组。在调用代码中,没有什么能阻止您传递一个或一些值。内部匹配方法将是一个数组
,据我了解您的问题,您的问题可以减少为:
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
您应该充分利用类型系统。