是否可以为重载方法使用不同的返回类型?

时间:2010-05-11 03:09:52

标签: overloading

在方法重载中,是否可以为重载方法设置不同的返回类型? 例如,

void foo(int x) ;
int foo(int x,int y);
double foo(String str);

在一般的面向对象编程中,有可能吗?

12 个答案:

答案 0 :(得分:31)

在一个类中,可能有几个方法共享相同的名称但

不同
  1. 参数类型
  2. 参数数量
  3. 方法中声明的参数的顺序
  4. 通过根据为方法提供的参数,在运行时,编译器确定要执行的方法版本。

    重载方法可能有也可能没有不同的返回类型。但是单独的返回类型不足以让编译器确定在运行时执行哪个方法。

答案 1 :(得分:17)

不可能有一个具有相同参数和不同return类型的方法。 以下情况中的编译器throws error(重复方法)。

方法1:

public int calc(int a, int b, int c)

方法2:

public String calc(int e, int f, int g)

抛出错误:

method calc(int, int, int) is already defined

答案 2 :(得分:15)

方法重载意味着在同一个类中具有两个或多个具有相同名称且具有不同参数的方法。方法重载的好处是它允许您实现支持相同语义操作但由参数编号或类型不同的方法。

重点

  • 重载方法必须更改参数列表
  • 重载方法可以更改返回类型
  • 重载方法可以更改访问修饰符
  • 重载方法CAN声明新的或更广泛的检查异常
  • 方法可以在同一个类或子类中重载

答案 3 :(得分:2)

这对重载无效。您只能通过更改参数列表来重载。单独更改返回类型对于方法重载无效,因为返回类型不是方法签名的一部分(方法名称和参数列表只在方法签名中)。

答案 4 :(得分:1)

只要你不做这样的事情:

int foo (int i, int has_default=0);
double foo (long l);
/* Skipping to the function call.  */
foo (1);
你应该没问题。上面的代码会导致问题,因为它可能试图调用任一函数。如果您正在使用C ++,那么它会变得非常糟糕,并且返回指针而不是基元或引用......

答案 5 :(得分:1)

如果返回类型不同,则无法进行方法重载,因为编译器无法确定需要调用哪种方法。

答案 6 :(得分:1)

Integer doSomething(){return null;}
String doSomething(){return null;}

main(){
    doSomething()
}

在这种情况下,编译器永远不会知道要调用哪个方法。

注 - 在编译期间检查方法重载

答案 7 :(得分:1)

简而言之,重载返回类型需要一个强大的键入系统,该系统可以从调用结果中派生要使用的函数。

Haskell和ML系列可以完成这项工作。

定义重载以限制更改args是不正确的,因为更改返回类型会留下足够的信息供编译器派生使用哪个函数。

答案 8 :(得分:0)

对于大多数支持方法重载的编程语言(Java,C#,C ++,...),如果参数类型不同,则返回类型也可以不同。

答案 9 :(得分:0)

查看这个很棒的答案,Function overloading by return type?

简而言之,大多数静态类型的语言都没有,但是一些动态类型的语言可以。

编辑:“简而言之”的答案适用于按返回类型重载严格。正如其他人所指出的,如果参数列表不同,并且可以由编译器解析,那么每个方法可能返回不同的类型。 只能通过ADA中的返回类型重载方法,因为返回值不能被忽略,编译器可以使用此信息解析方法调用。

答案 10 :(得分:0)

是的,您给出的示例是可能的我们可以在c#

中以这种方式进行方法重载
void foo(int x)
    {
    }
    int foo(int x, int y)
    {
        return 0;
    }
    double foo(String str)
    {
        return 1;
    }

答案 11 :(得分:0)

您可以使用C ++的Varadic模板功能 听到的是例子:

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);

以下是我们可以称之为的几种方式:

%matplotlib qt  

更多参考https://eli.thegreenplace.net/2014/variadic-templates-in-c/