为什么语言不允许通过返回值重载方法?

9 language-design

c,java和许多其他语言不注意返回值.

int   i = func()
float f = func()
int   func() { return 5 }
float func() { return 1.3}
Run Code Online (Sandbox Code Playgroud)

为什么以上不合法?它是否使编程更加困难

int i = func(func(func(func2(func3())))) //you dont know what you are getting
Run Code Online (Sandbox Code Playgroud)

编写编译器难吗?还有更多语言的歧义吗?有没有一种语言可以做到这一点?

Her*_*rms 17

这个案子怎么样?

class A implements Foo { /*...*/ }
class B implements Foo { /*...*/ }

A func() { return new A(); }
B func() { return new B(); }

Foo v = func(); // which do you call?!
Run Code Online (Sandbox Code Playgroud)

当允许重载具有不同参数的单个函数名时,已存在歧义问题.必须检查返回类型可能会使解决正确的功能更加困难.

我确信一种语言可以实现这一点,但它会使事情变得更复杂,并且通常会使代码更难理解.

  • 同样``System.out.println(func()+ func())`输出应该是什么? (2认同)

Fre*_*örk 14

让我们说这是允许的,这可以称之为:

func();
Run Code Online (Sandbox Code Playgroud)

这可能不是完整的答案,但我认为这是它不合法的一个原因.

  • 我认为不处理返回值是不好的做法.这应该是无效的抛出异常或应检查返回值.但是var v = func(); (C#样式分配)可能会导致问题......(嗯)) (2认同)

jmg*_*jmg 10

是的,允许在返回类型上重载会使语言复杂化.它使重载标识符(例如函数名称)的解析变得复杂.但这并非不可能,例如Haskell允许根据其返回类型重载函数.

class Num a where
  fromInteger :: Integer -> a 
  ...
Run Code Online (Sandbox Code Playgroud)

Num是Haskell中的一个类型类,它有一个被调用的方法fromInteger,它是一个从任意大小Integer到任意类型的函数,它具有一个实例Num.Haskell类型类机制与面向对象语言的类概念有很大不同.因此我的解释可能听起来很奇怪

但是,结果是我可以使用fromInteger函数,并且根据调用上下文,在编译时选择不同的实现.

对类型系统进行了全面的研究,使这一特性成为可能.因此,我认为它在静态类型语言中是可行的.动态类型语言要么需要时间旅行,要么需要一些聪明的想法.


Jes*_*sse 9

避免歧义.

a( int )
a( bool )
int b()
bool b()

a( b() ) -- Which b?
Run Code Online (Sandbox Code Playgroud)

这里类型推断具有循环依赖性.这b取决于哪个a,但a取决于哪个b,所以它会卡住.

禁止返回类型的重载可确保类型推断是非循环的.返回类型始终可以由参数类型确定,但参数类型不能由返回类型确定,因为它们可能又由您尝试查找的参数类型确定.


Gre*_*ill 6

对于C++示例,请考虑:

void g(int x);
void g(float x);
g(func());
Run Code Online (Sandbox Code Playgroud)

g()将调用哪些重载函数?