2016-01-27 3 views
1

Существует три класса: 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()); 
    } 
} 

Это из-за метода запуска определения шаблона только для родительского класса?

ответ

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 meth обмундирование оливково-серого цвета