2012-11-09 53 views

回答

24

这样做是因为编译器无法找出所有上下文中的重载。

例如,如果你调用

String x = method1("aaa"); 

编译器知道你正在寻找第二个重载。但是,如果你调用

method1("aaa"); 

这样,编译器不知道你要调用,因为它是确定调用返回String的方法和丢弃结果两种方法之一。为了避免这样的含糊之处,Java禁止仅在返回类型上有所不同的重载。

3

您不仅可以在它的返回类型重载方法。这是非法的。让我们暂时假设使用返回类型的重载方法是合法的,并且您定义了两个method1方法。现在,我们要调用它返回String object

method1(sth);

String string = method1(sth);

的JVM理论上就能够认出你inteded调用该方法,但对这样的叫什么正如你所看到的,这两种方法都可以被调用,并且这些操作是明确的。 JVM不知道应该调用哪个方法。这就是为什么这种超载是被禁止的。

+0

+1为答案。 – Raghunandan

+5

你不能,因为你不能?真? – m3th0dman

+0

我解释说,在编辑;)我submited短的帖子,因为写这样的简单问题的答案就像一场比赛,所以如果你可以请删除你的投票。 –

0

您可以调用函数作为过程:method1("arg");其中method1是您的列表中的第二种方法(String method1(String arg){})。编译器将无法区分它与第一个(void method1(String arg){})。

1

因为它是不可能解决这些重载的方法应该在这样的情况下,被称为:

public static void main(String... args) { 
    method1("aaa"); 
} 
-1

了Methode超载的参数数量和类型的基础上,检查没有回报的基础上, type.Thats你为什么得到错误。

+0

问题是 - 为什么这个错误。 –

+0

因为它试图定义两个具有相同签名的方法,它正在methode表中检查,并且不允许。 –

+0

为什么不允许? –

3

由于您的问题没有涉及标题中的任何特定编程语言(我知道它在标签中),我将分享我最近的经验Swift。 在Swift函数/方法签名实际上包括返回类型。因此编译器会引发只有当你调用这个函数/方法没有明确指定返回类型的错误,例如:

func some() -> Bool { 
    return true; 
} 

func some() -> Int { 
    return 1; 
} 

let valBool: Bool = some() 
let valInt: Int = some() 

// this doesn't work: Ambiguous use of 'some' 
some() 

在此斯威夫特的顶部,甚至使它更有趣。它只允许您在参数名称不同的情况下拥有2个具有相同参数和返回类型的函数/方法,例如,:

func some(#foo: Bool) -> Bool { 
    return foo; 
} 

func some(#bar: Bool) -> Bool { 
    return bar; 
} 

some(foo: true) 
some(bar: false) 

因此它给你的方法签名

UPD 语义分化。由于雨燕2.0外部参数名称已更改,现在你必须两次提供外部和本地名称,即使是相同的

func some(foo foo: Bool) -> Bool { 
    return foo; 
} 

func some(bar bar: Bool) -> Bool { 
    return bar; 
} 

some(foo: true) 
some(bar: false) 
+0

+1更广泛,然后Java透视。听到你的意见是否有利于方便的方便胜过与这种选择有关的问题会很有趣。我猜对于简单的返回类型无关紧要,但对于对象,这可能允许重用输出变量资源...然后不让您轻易忽略返回值,我将其看作一个功能而不是轻松。 – Slava

0

有几点设计之类的重载决议时需要考虑的。

原因省略超载的返回类型:

  1. 简化忽略函数的返回值(就像人们常常错误代码做)。
  2. 使程序更容易为人类读者消化。特别是,这是Python中的原因,它们根本没有函数重载。 (品味)
  3. C遗产。当语言来自C-家庭和设计师不考虑什么是一个大问题,它是留给它一直...

原因加上返回类型超载:

  1. 制作很难忽视返回的值。这可能会方便,并节省一些打字,但肯定会咬你一天。
  2. 表达能力(当然不是简单的消化:))。你有没有想写int x = json.get("int_value"); float y = json.get("float_value");之类的东西?在一些语言(如C++)中,仍然可以使用代理和转换操作符来实现,但返回类型的重载会更容易。
  3. 表现力。每次将retun值作为函数的参考传递给它,只是为了重用资源,这可能是返回类型的重载(带有类似隐藏参数)。考虑string s; getline(cin, s); vs string s = getline(cin);。这就是表现力与参照透明度以及最终易于代码消化的地方。

现在回到你的问题'为什么?'。既然你问的是Java,那么答案很明显是因为James重视理由忽略返回类型超载的原因,以便将它们包含在语言中。

相关问题