【发布时间】:2010-05-11 03:09:52
【问题描述】:
在方法重载中,重载的方法可以有不同的返回类型吗? 例如,
void foo(int x) ;
int foo(int x,int y);
double foo(String str);
一般的面向对象编程,有可能吗?
【问题讨论】:
标签: overloading
在方法重载中,重载的方法可以有不同的返回类型吗? 例如,
void foo(int x) ;
int foo(int x,int y);
double foo(String str);
一般的面向对象编程,有可能吗?
【问题讨论】:
标签: overloading
在一个类中,可以有多个方法同名但不同
通过根据为方法提供的参数,在运行时,编译器决定执行哪个版本的方法。
重载的方法可能有也可能没有不同的返回类型。但是仅返回类型不足以让编译器确定在运行时要执行哪个方法。
【讨论】:
void fun(int a, char a){ } void fun(char a, int a){ } 不工作
方法重载意味着在同一个类中有两个或多个同名的方法,但参数不同。方法重载的好处是它允许您实现支持相同语义操作但参数数量或类型不同的方法。
要点
【讨论】:
不可能有具有相同参数和不同return 类型的方法。
以下情况下的编译器throws error(复制方法)。
方法一:
public int calc(int a, int b, int c)
方法二:
public String calc(int e, int f, int g)
抛出错误:
method calc(int, int, int) is already defined
【讨论】:
在返回类型不同的情况下,不可能没有方法重载,因为编译器无法确定他需要调用哪个方法..
【讨论】:
Integer doSomething(){return null;}
String doSomething(){return null;}
main(){
doSomething()
}
在这种情况下,编译器永远不会知道要调用哪个方法。
注意 - 在编译期间检查方法重载
【讨论】:
只要你不做这样的事情:
int foo (int i, int has_default=0);
double foo (long l);
/* Skipping to the function call. */
foo (1);
你应该没事的。上面的代码会导致问题,因为它可能试图调用任何一个函数。如果你使用 C++ 会变得非常糟糕,并且你返回的是指针而不是原语或引用......
【讨论】:
这对于重载无效。您只能通过更改参数列表来重载。单独更改返回类型对方法重载无效,因为返回类型不是方法签名的一部分(只有方法名称和参数列表在方法签名中)。
【讨论】:
看看这个很棒的答案,Function overloading by return type?
简而言之,大多数静态类型语言不会,但一些动态类型语言可以。
编辑:“简而言之”的答案适用于按返回类型严格重载。正如其他人指出的那样,如果参数列表不同,并且可以由编译器解析,那么每个方法都可能返回不同的类型。 可以在 ADA 中仅通过返回类型重载方法,因为返回值不能被忽略,编译器可以使用此信息解析方法调用。
【讨论】:
是的,您给出的示例是可能的,我们可以在 c# 中以这种方式进行方法重载
void foo(int x)
{
}
int foo(int x, int y)
{
return 0;
}
double foo(String str)
{
return 1;
}
【讨论】:
您可以使用 C++ 的 Varadic 模板功能 举个例子:
template<typename T>
T adder(T v) {
return v;
}
template<typename T, typename... Args>
T adder(T first, Args... args) {
return first + adder(args...);
}
我们可以这样称呼它:
long sum = adder(1, 2, 3, 8, 7);
std::string s1 = "x", s2 = "aa", s3 = "bb", s4 = "yy";
std::string ssum = adder(s1, s2, s3, s4);
更多参考https://eli.thegreenplace.net/2014/variadic-templates-in-c/
【讨论】:
简而言之,重载返回类型需要一个强大的类型系统,它可以从调用结果中派生出要使用的函数。
Haskell 和 ML 家族可以完成这项工作。
定义重载以限制更改参数是不正确的,因为更改返回类型会为编译器留下足够的信息来派生要使用的函数。
【讨论】:
对于大多数支持方法重载的编程语言(Java、C#、C++、...),如果参数类型不同,那么返回类型也可以不同。
【讨论】: