переопределение / перегрузка методов с стиранием типа в Java - PullRequest
0 голосов
/ 30 января 2019

с данными 2 классами:

public class A{
    public <T> Cell<T> f(Cell<T> l){
        return null;
    }
}
public class B extends A{
    public <T> Cell<T> f(Cell<Cell<T>> l){ // trying to override
        return null;
    }
}

(когда Cell является неким универсальным классом).

Я понимаю, что после удаления типа классы выглядят следующим образом:

public class A{
    public Cell f(Cell l){
        return null;
    }
}
public class B extends A{
    public Cell f(Cell l){ // trying to override
        return null;
    }
}

До того, как я узнал, что такое стирание типов, я думаю, что я действительно понял, почему компилятор видит это как перегрузку.

, но теперь, когда я (думаю, что) я знаю о стирании типов, двасигнатуры методов одинаковы, и я действительно думаю, что имеет больше смысла в том, что компилятор увидит это как ПЕРЕГРУЗКУ.

после компиляции получил, что компилятор Java видел это как попытку ПЕРЕГРУЗИТЬ, а не переопределитьи выдает ошибку для перегрузки к методам с одинаковой сигнатурой.

мой вопрос : почему компилятор все еще видит в этом попытку ПЕРЕГРУЗКИ, а не ПЕРЕГРУЗКИ, хотя после стирания типа сигнатурыточно так же?

спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Ошибка "перегрузка с такой же сигнатурой" здесь кажется адекватной.Технически это не переопределяет, потому что для дженериков компилятора значение B и f не удовлетворяет сигнатуре A, так как f A T не ограничивается реализацией Cell<?>, так что f B не переопределяет f A;вместо этого имеет смысл называть это «перегрузкой», поскольку в общем случае эти сигнатуры отличаются, несмотря на то, что после стирания они остаются одинаковыми.

Я считаю, что для этого конкретного сценария была добавлена ​​ошибка «перегрузка с такой же сигнатурой» с обобщениями, что привело к конфликту стираний.

...