Речь идет о следующем блоке кода:
public class SomeClass {
public static class A {
public void f(int x) {
System.out.println("1");
}
public void f(Object x) {
System.out.println("2");
}
}
public static class B extends A {
public <T> void f(T x) { // *
System.out.println("3");
}
}
}
Строка *
не компилируется со следующей ошибкой:
Описание Путь к ресурсу Местоположение Тип Имя Конфликт: метод f (T) типа SomeClass.B имеет то же стирание, что и f (Object) типа SomeClass.A, но не отменяет его.
Чтобы избежать дублирования: я посмотрел на: Тип стирание, переопределение и обобщения, метод имеет такое же стирание, что и другой метод типа, и хотя я получил ответ (частично, потому что я все еще не полностью его понял), почему возникает ошибка компиляции (чтобы избежать двусмысленности из-за стирания типа? вот оно?) основная проблема в том, что я не понимаю, почему, если я переключаюсь между двумя методами f(Object x)
и f(T x)
, код будет таким:
public class SomeClass {
public static class A {
public void f(int x) {
System.out.println("1");
}
public <T> void f(T x) {
System.out.println("3");
}
}
public static class B extends A {
public void f(Object x) {
System.out.println("2");
}
}
}
Я не получаю сообщение об ошибке компиляции. Почему это происходит? В чем ключевое отличие, при котором для первого кода я получаю ошибку компиляции, а для второго - нет. Хотел бы кое-какие объяснения по этому поводу, спасибо!
void f(Object x)
является дополнительной подписью<T> void f(T x)
, но не наоборот. - person Oliver Charlesworth   schedule 23.07.2017