Java 使用模板调用重载方法

Java 使用模板调用重载方法,java,templates,overloading,Java,Templates,Overloading,有三个类,ChildChild、Child和Parent彼此扩展。我为大多数外部类调用了使用模板的方法,我希望调用方法doSomething来打印“CHILD”。而不是调用前面的方法 class Test { public <T extends Parent> void doSomething(T input) { System.out.println("PARENT"); } public <T extends Child> vo

有三个类,
ChildChild
Child
Parent
彼此扩展。我为大多数外部类调用了使用模板的方法,我希望调用方法
doSomething
来打印“CHILD”。而不是调用前面的方法

class Test {
    public <T extends Parent> void doSomething(T input) {
        System.out.println("PARENT");
    }
    public <T extends Child> void doSomething(T input) {
        System.out.println("CHILD");
    }

    public <T extends Parent> void run(T input) { doSomething(input); }
}

class Main {
    public static void main(String[] args) {
        Test t = new Test();
        t.run(new ChildChild());
    }
}
类测试{
公共无效剂量测定(T输入){
System.out.println(“母公司”);
}
公共无效剂量测定(T输入){
系统输出打印项次(“子项”);
}
公共无效运行(T输入){doSomething(输入);}
}
班长{
公共静态void main(字符串[]args){
测试t=新测试();
t、 运行(new ChildChild());
}
}

这是因为只为父类定义模板的方法运行吗?

是的,当编译器删除泛型类型参数时,它们将被其类型边界替换,因此您的
运行
方法变为:

public void run(Parent input) { doSomething(input); }
重载方法变成:

public void doSomething(Parent input) {
    System.out.println("PARENT");
}
public void doSomething(Child input) {
    System.out.println("CHILD");
}
因此,将调用
doSomething(父输入)
(请记住,方法重载解析是在编译时使用编译时类型确定的),而不管传递给
run
方法的实例的运行时类型如何