Следующий код:Почему это переопределение метода объявляет ошибку компиляции?
class Parent {
public void method(List parameter){
}
}
class Child extends Parent {
public void method(List<String> parameter) {
}
}
не удается скомпилировать со следующей ошибкой:
Parent.java:12: error: name clash: method(List<String>) in Child and method(List) in Parent have the same erasure, yet neither overrides the other
public void method(List<String> parameter) {
^
1 error
Но я проверяю, что JLS8 в §8.4.8.1 говорит:
An instance method mC declared in or inherited by class C, overrides from C another method mA declared in class A, iff all of the following are true:
...
The signature of mC is a subsignature (§8.4.2) of the signature of mA.
...
И в §8.4.2 в нем говорится:
The signature of a method m1 is a subsignature of the signature of a method m2 if either:
...
the signature of m1 is the same as the erasure (§4.6) of the signature of m2.
И в этом случае объявления оригинала и переопределения метода имеют одно и то же стирание, так почему компиляция терпит неудачу?
'Список' не является стиранием 'List', поэтому по спецификации, которую вы указали, это не поднаклейка. Я думаю, вы перепутали 'm1' и' m2'. –
4castle
Не считаются ли они стилями типа 'List
Они оба типа стираются в 'List', но спецификация, которую вы указали, касается не того, есть ли у них обычное стирание, это вопрос о том, является ли метод подкласса методом стирания суперкласса. Если родительский класс имеет «Список», а подкласс имеет «Список», все будет в порядке. –
4castle