代码之家  ›  专栏  ›  技术社区  ›  maddingl

如何转发参数列表

  •  1
  • maddingl  · 技术社区  · 7 年前

    我已经声明了一个接口 Listable Node 包含 可列出 ,和 SinglyLinkedList 包含节点。这个 单链接列表 包含一个 search() matches() 可列出 . 我想要 可列出 匹配() 应该是任意的。 搜索() 返回新的 单链接列表 仅包含以下元素: 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 . 我希望它等于 搜索args [searchArgs] .

    匹配() ,因为无论何时使用 匹配() ,它还尝试处理未创建的问题。

    在我看来,问题是 搜索args 将其转发到时打包到另一个数组中 匹配() . 我不想传递这个数组,而是将其元素作为参数传递。

    有没有办法在Java中做到这一点?

    3 回复  |  直到 7 年前
        1
  •  0
  •   user7387082 user7387082    7 年前

    我不确定是否通过 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] .

        2
  •  0
  •   WeGa    7 年前

    这需要在使用matches()时传递一个参数数组

    但您在方法的签名中指定,它接受可变长度的数组。在调用代码时,没有什么可以阻止您传递一个或一些值。在matches方法中,它将是一个数组

        3
  •  0
  •   Gabriel    7 年前

    据我所知,你的问题可以归结为:

    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
    

    你应该好好利用打字系统。