方法重载(method overloading)是指在一个类中创建多个具有相同名称但参数不同(类型、顺序、数量)的方法的能力。这种方法可以将相似的操作逻辑上组合在一起,提高代码的可读性。
public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }
问题: 是否可以仅根据返回类型重载方法(不更改参数)?
答案: 不能。重载仅在参数列表不同的情况下才可能。仅根据返回类型的差异会导致编译错误。
void foo(int a) {} int foo(int a) { return 1; } // 错误!返回类型在重载中不被考虑。
故事
在一个项目中,开发者创建了两个方法:
public void process(int x, double y) {...} public void process(double x, int y) {...}在调用
process(5, 10)时,编译器无法选择正确的版本,导致调用的歧义错误。这延迟了模块的交付。
故事
在应用程序中,基于varargs和数组的重载方法:
public void log(String... messages) {...} public void log(String[] messages) {...}传递数组
String[] data并不总是调用预期的重载,因此某些数据记录不正确——部分信息丢失!数组与varargs之间的差异显得至关重要。
故事
开发者重载了类的方法,而没有考虑到类型的自动装箱:
public void save(Integer i) {...} public void save(int i) {...}在调用
save(null)时,发生了空指针异常,因为Java选择了最具体的类型(int),但null不能转换为原始类型!