有三个类,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());
}
}
这是因为方法仅为Parent类运行定义模板吗?
答案 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
方法的实例的运行时类型如何