在Java中列为输出参数

时间:2012-07-20 14:12:01

标签: java list function-calls output-parameter

我正在尝试编写一个将List对象作为输出参数的Java函数。

boolean myFunction(int x, in y, List myList)
{
    ...Do things...
    myList=anotherList.subList(fromIndex, toIndex);
    return true
}

在此之前我调用函数我声明myList如下:     列出myList = null; 然后我调用函数myFunction(x,y,myList) 但是当我尝试操作myList时,我发现myList仍然是null。

我确定我的函数代码中的变量“antherList”不为null,我确信subList函数返回一个非空List。

是什么原因,以及如何在Java函数中传递List作为输出参数? 非常感谢你。

5 个答案:

答案 0 :(得分:4)

Java总是使用pass by value。这意味着操纵传递的变量不会影响调用者传递的变量。

为了解决您的问题,有一些可能性:

  • 返回子列表:

    List myFunction(int x, int y) { return anotherList.subList(....);}
    

    我知道这种方式可以获得你的布尔返回值。

  • 创建一个包含List和。

    指针的结构
    class Reference <T>
    {
        public T ref;
    }
    
    boolean myFunction(int x, int y, Reference<List> listRef)
    {
          listRef.ref = anotherList.subList(....);
          return true;
    }
    
  • 创建一个结构,其中包含您希望方法返回的所有输出:

    class MyFunctionOutput
    {
         List list;
         boolean b;
    }
    
    MyFunctionOutput myFunction(int x, int y)
    {
         MyFunctionOutput out = new MyFunctionOutput();
         out.list = anotherList.subList(....);
         out.b = true;
         return out;
    }
    
  • 或者最简单的方法:传递初始化的List而不是null,让函数添加子列表,就像Attila建议的那样。

答案 1 :(得分:4)

您无法在Java中传递 out 参数。您需要将返回类型声明为List或更改传递列表的 contents

boolean myFunction(int x, in y, List myList) 
{
  ...Do things... 
  myList.clear();
  myList.addAll(anotherList.subList(fromIndex, toIndex)); 
  return true 
} 

注意:out-parameter表示您更改包含传递给函数的值的变量的值。在你的情况下,它将意味着返回一个不同的List对象。相反,您将返回相同的列表对象,但内容已更改。

将参数视为传递值的本地副本:替换整个对象的任何更改都将在函数返回时丢失。如果您只是更改其内容/状态,则在您访问传入的同一对象时,该更改将保持不变(本地副本由指向同一对象的引用组成)

注意:它可能是出于演示目的,但您应该使用泛型来指定列表中包含的对象:例如List<String>代替原始List类型

答案 2 :(得分:2)

Java中的

引用按值传递。因此,您无法指定 out参数

你可以做的(但是)改变传入的对象。所以在上面的例子中,你可以传入一个空的List,并在你调用的方法中填充它。

即。在上面:

myList.addAll(...);

您可能希望断言传递列表为空的前提条件。

我或许会建议这不是Java世界中非常常见的模式。由于 out参数不存在,因此参数作为参数传入的参数不会发生预期的行为,您可能最好创建一个合适的对象类型来返回。

答案 3 :(得分:1)

myList变量是该函数的本地变量。引用按值传递,而不是通过Java世界中的指针传递。退出后,它将从上下文堆栈中删除。一个可能的选择是不返回布尔值但返回列表本身。然后,您可以测试列表中的null,以查看您的函数是否有效。

另一种选择是实际创建列表,然后将其传递给函数(非null)。然后你的函数不需要创建一个新的列表,只需添加值即可。

答案 4 :(得分:0)

简短回答 - 只返回新列表作为函数的返回值:

List myFunction(int x, in y, List myList) {
    ...Do things...
    return anotherList.subList(fromIndex, toIndex);
}

长的答案是java在调用函数时复制对象的指针,这意味着如果将新对象分配给方法参数,则不会影响原始变量。因此,如果要更改对象值,则必须保存参数引用。