使用模板调用重载方法

时间:2016-01-27 12:54:17

标签: java templates overloading

有三个类,ChildChildChildParent一个扩展另一个类。我使用模板调用方法用于大多数外部类,我希望调用方法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());
    }
}

这是因为方法仅为Parent类运行定义模板吗?

1 个答案:

答案 0 :(得分:2)

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

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(Parent input)(请记住,在编译时使用编译时类型确定方法重载解析),而不管要传递给run方法的实例的运行时类型如何