Тип стирания, переопределение и дженерики

Может кто-нибудь объяснить мне, почему

@Override public void fooMethod(Class c) 

не отменяет

 public void fooMethod(Class c) 

и вместо этого дает мне следующие ошибки:

  - Название столкновения: метод fooMethod (class ) 
 типа SubClass имеет такое же стирание, как fooMethod (Class) of 
 тип SuperClass, но не переопределяет его

  - Метод fooMethod (class ) Типа 
 SubClass должен переопределить метод суперclassа

?

Изменить: « java -version » говорит о среде выполнения Java (TM) 2, стандартной версии (assembly 1.5.0_16-b06-284). Что касается fragmentа кода, он уже выше, в значительной степени; выше приведенное ниже.

Подпись fooMethod(Class) fooMethod(Class) с сигнатурой fooMethod(Class) после стирания, поскольку стирание Class Является просто Class ( JLS 4.6 ). Следовательно, fooMethod(Class) является подназначением fooMethod(Class) Но не наоборот ( JLS 8.4.2 ).

Для переопределения с помощью методов экземпляра вам нужно, чтобы метод переопределения являлся подъявлением переопределенного метода ( JLS 8.4.8.1 ). Это явно не так.

Теперь, когда мы установили, что ваш метод подclassа не переопределяет метод суперclassа в соответствии с JLS, давайте рассмотрим последствия выполнения во время стирания типа. Теперь у нас есть два метода, которые выглядят точно «одинаковыми» (одно и то же имя, одни и те же типы параметров), но не переопределяют друг друга. Если они не переопределяют, они должны быть доступны в подтипе как отдельные методы, но они имеют идентичные подписи времени выполнения: конфликт. Поэтому Java должен его запретить.

Переопределение общих типов параметров с использованием необработанных типов параметров разрешено, поскольку для этого существуют только типы типов: они являются удобным механизмом с конкретными правилами неправильного типа для взаимодействия с устаревшим кодом. Таким образом, система типов здесь решит, что метод подclassа переопределяет суперclass, они идентичны после стирания типа, и у нас никогда не будет конфликта. Как следствие, эти библиотеки могут быть созданы независимо от существующего неродного кода.

Поскольку Class Более специфичен, чем просто Class .

Например, foo(Class) не может переопределить foo(Class) . Я забыл этот термин, но типы с дженериками всегда будут отличаться от тех, которые есть.

Давайте будем гением компьютера.