为什么函数没有参数化的返回类型,因为它有参数化输入?

时间:2009-01-23 06:56:32

标签: java function return-type

这总是迫使我们返回一个参数,以防我需要返回多个,比如一个List和一个String。函数参数中没有这个限制。

6 个答案:

答案 0 :(得分:8)

这个问题是诸如F#,haskell等功能语言试图解决的问题。问题是在硬件中,函数的返回值最初是通过CPU寄存器返回的,因此您只能返回单个值。传承这种遗留的C语法和C ++(以及C#,Java)也继承了这一点。

答案 1 :(得分:4)

事实上,有些语言可以满足您的需求。例如Python,看看这段代码。它返回2个值:1个字符串和另一个int。

>>> def myFunc():
...   string_val = "techmaddy"
...   int_val = 10
...   return string_val, int_val
...
>>>
>>> s, i = myFunc()
>>>
>>> print s
techmaddy
>>>
>>> print i
10

我希望它会有所帮助。

PS:在封面下,我猜Python正在将它装入一个列表并取消装箱。我不太了解Python,告诉你究竟是什么。

答案 2 :(得分:4)

如果你需要经常这么做,那么创建一个类只是为了保存结果并返回它。

这也允许您以与记录参数相同的方式记录函数返回的内容。

答案 3 :(得分:3)

或者,从您的方法返回Object []并执行

return new Object[] { list, string};

如果您需要更多参数化返回类型,则可以创建Pair< X,Y>类,或三联体< Z,Y,Z>并返回那些。

答案 4 :(得分:1)

幸运的是,Javascript是一种动态语言。这意味着您可以构造任何类型的对象并将其返回。这有效地满足了您具有“参数化”返回值的要求,尽管是以非常不安全的方式。

例如:

function stuff() {
    return {
        "foo": "a",
        "bar": "b"
    }
}

var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"

答案 5 :(得分:0)

处理复杂返回行为的方法是传递方法调用的接口。 e.g。

public interface Results<R> {
    public void processing(String stage);
    public void success(String mesg, R result);
    public void successes(String mesg, List<R> result);
    public void thrown(Throwable t);
}

public void process(Results<R> results, String text, List<String> data);