在 Java 中使用不同的返回类型重载?

为什么仅仅通过改变返回类型就不可能重载函数?在 Java 的未来版本中,这种情况会改变吗?

顺便问一下,仅供参考,这在 C + + 中可行吗?

107088 次浏览

你不能在 Java 中做,也不能在 C + + 中做。其基本原理是,仅靠返回值不足以让编译器找出要调用哪个函数:

public int foo() {...}
public float foo() {..}


...
foo(); // which one?

原因是 Java 中的重载只允许用于具有不同 签名的方法。

返回类型不是方法签名的一部分,因此不能用于区分重载。

请参阅 Java 教程中的 定义方法

在 Java 5.0之前,重写方法时,参数和返回类型必须完全匹配。在 Java 5.0中,它引入了一个名为协变返回值类型的新工具。可以重写具有相同签名的方法,但返回返回对象的子类。换句话说,子类中的方法可以返回一个对象,该对象的类型是该方法返回的类型的子类,该方法在超类中具有相同的签名。

编译器在区分方法时不考虑返回类型,因此即使两个方法具有不同的返回类型,也不能声明具有相同签名的两个方法。

当重载一个方法时,返回类型并不重要。我们只需要确保没有歧义!

Java 知道调用哪个方法的唯一方法是区分参数列表的类型。如果编译器允许两个具有相同名称和相同参数类型的方法,则无法确定应该调用哪一个方法。

由于参数不同,Java 中的 Overloaded方法可能有不同的返回类型。

查看示例代码。

public class B {
    

// Method to be overloaded
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 编译器将呈现编译器时间错误。

重载方法与同名的其他方法完全不同。重载不过是名称重用。

public int division(int a, int b){
int result = a/b;
return result;
}
public double division (float a, float b){
double result = a/b;
return result;
}

我很确定在 java 8中

没事的