Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何转发参数列表_Java_Parameter Passing_Variadic Functions - Fatal编程技术网

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()时检查我的参数。。。这很尴尬。谢谢一点也不尴尬。所有最好的与你试图代码!