基于泛型限制的Java方法重载行为是否有官方标准定义?
Java重载方法选择行为的确定性问题
我定义了process()方法,期望仅实现First接口的对象与同时实现First和Second接口的对象调用不同的重载逻辑。同时实现两个接口的对象虽可匹配仅要求First接口的process()方法,但实际会调用更具体的重载版本。想咨询该行为是否在所有Java实现中均有明确定义?
示例代码
public class Main { public interface Printer { void print (); } public interface Calculator { void calc (); } public static class MyPrinter implements Printer { @Override public void print () { System.out.println ("MyPrinter"); } } public static class MyPrintingCalculator implements Printer, Calculator { @Override public void print () { System.out.println ("MyPrintingCalculator"); } @Override public void calc () { System.out.println ("Calculating"); } } public static <T extends Calculator & Printer > void process (T something) { something.print (); something.calc (); } public static void process (Printer something) { something.print (); } public static void main (String args[]) { final MyPrinter printer = new MyPrinter (); final MyPrintingCalculator calculator = new MyPrintingCalculator (); process (printer); process (calculator); } }
解答
这个行为是Java语言规范(JLS)明确定义的,所有合规的Java实现都会严格遵循,属于重载方法解析的核心规则:
当调用重载方法时,编译器会从所有能匹配的方法里挑最具体的那个。放在你的场景里:
MyPrintingCalculator实例既能匹配process(Printer),也能匹配泛型版的process(T)(因为它同时实现了两个接口,满足T extends Calculator & Printer的约束)。- 按照规范,泛型版方法的参数范围更窄——它只接受同时实现两个接口的对象,而
process(Printer)接受所有实现Printer的对象。范围更窄的方法就是更具体的,所以编译器会优先调用泛型版的process。
这种选择逻辑是Java规范强制要求的,不存在不同实现之间的差异。
内容的提问来源于stack exchange,提问作者Mi-La
相关产品推荐
相关产品推荐

