为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗?
顺便说一句,仅供参考,这在C ++中可能吗?
为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗?
顺便说一句,仅供参考,这在C ++中可能吗?
Answers:
您无法在Java中做到这一点,也无法在C ++中做到这一点。这样做的理由是,仅返回值不足以使编译器确定要调用的函数:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
,是double
。
foo();
没有返回类型将是模棱两可的事实,不一定是不允许将其作为重载的理由。有些参数可能引起歧义(例如foo(null);
),但不会使重载固有地无效。
calculateAnswer(double, int, double, double)
”。看到不包括返回类型@konmik。
在Java 5.0之前,重写方法时,参数和返回类型必须完全匹配。在Java 5.0中,它引入了一种称为协变返回类型的新功能。您可以覆盖具有相同签名的方法,但返回所返回对象的子类。换句话说,子类中的方法可以返回一个对象,该对象的类型是该方法返回的类型的子类,该方法具有超类中的相同签名。
Overloaded
假设参数也不同,则Java中的方法可能具有不同的返回类型。
查看示例代码。
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
区分方法时,编译器不会考虑返回类型,因此即使两个方法具有不同的返回类型,也无法声明具有相同签名的两个方法。
如果您知道函数的执行,那么您会知道,当我们调用函数时,定义部分将执行,最后我们需要return语句,因此我们可以说return是在函数的整个定义之后出现的,这就是为什么有两个或多个具有相同名称,相同类型和否的更多函数。那么在调用时,由于函数名称和参数相同,因此在调用编译器时将如何知道要调用哪个参数。首先调用时,所有焦点都将放在参数和函数名称上,最后在函数定义完成后,我们将处理return语句。
编译时错误比运行时错误要好。因此,如果您声明具有相同参数的相同方法,则Java编译器将呈现编译器时间错误。