如何转发参数列表



我已经声明了一个接口Listable,包含ListableNode和包含节点的SinglyLinkedListSinglyLinkedList包含一个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

您应该充分利用类型系统。

最新更新