过载问题: 方法重载(如 CollectionClassifier 程序的示例)可能会导致意外行为,因为要根据参数类型选择要调用的方法是在编译时发生的,而不是在运行时发生的。 过载与覆盖: 重载是在编译时选择方法,而重写是在运行时根据类型选择正确的方法,这使得行为更加可预测。 避免混乱的开销: 当不清楚将为一组参数调用哪个方法时,重载会让程序员感到困惑。这在公共 API 中尤其成问题。 推荐: 避免导出具有相同数量参数的两个重载。 以不同的方式命名方法而不是重载(如 writeInt 和 writeBoolean)。 使用可变参数时,避免重载。 泛型和自动装箱案例: Java 中泛型和自动装箱的引入导致了重载问题,如 List.remove 的示例所示,由于存在多个重载,它的行为可能会令人困惑。 函数式接口和 lambda: Java 8 中添加的 lambda 通过重载采用函数式接口的方法而增加了混乱的风险,特别是当这些接口不是“根本不同”时。 实用解决方案: 使用instanceof进行显式测试可以避免与重载相关的问题。 使用完全不同的参数(无法相互转换的类型)进行重载可以避免混淆。 构造函数和重载:虽然构造函数总是重载,但使用静态工厂可以避免这种复杂性。 合理的例外: 在某些情况下,例如改编旧类,可能需要重载,但必须谨慎使用,确保使用相同参数调用时重载方法的行为相同。 结论: 应谨慎使用重载。虽然技术上可行,但通常最好以不同的方式命名方法或避免混淆重载,以确保代码更清晰、更可预测。 书中的示例: