Следующий код:
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 говорит:
Метод экземпляра mC, объявленный в классе C или унаследованный им, переопределяет из C другой метод mA, объявленный в классе A, если выполняются все следующие условия:
...
Подпись mC является дополнительной подписью (§8.4.2) подписи mA.
...
А в §8.4.2 говорится:
Сигнатура метода m1 является дополнительной подписью сигнатуры метода m2, если:
...
подпись m1 такая же, как стирание (§4.6) подписи m2.
И в этом случае объявления исходного и замещающего методов имеют одинаковое стирание, так почему же компиляция не выполняется?
List<String>
не является стираниемList
, поэтому, согласно указанной вами спецификации, это не подпись. Я думаю, вы перепуталиm1
иm2
. - person 4castle   schedule 21.09.2016List<Object>
?. - person Jaime Hablutzel   schedule 21.09.2016List
, но указанная вами спецификация не о том, имеют ли они общее стирание, а о том, является ли метод подкласса стиранием метода суперкласса. Если бы у родительского класса былоList<String>
, а у подкласса былоList
, все было бы в порядке. - person 4castle   schedule 21.09.2016