2015-02-10 2 views
3

У меня есть один класс, который определил следующие два метода:Почему не Java Тип Erasure предотвращает этот код при компиляции

public Map<String, Map<String, String>> method(final Map<String, Map<String, String>> data) 

public boolean method(final Map<String, String> data) 

на основе типа стиранием Java дженериков, этот код не компилируется, потому что они все в конечном итоге с:

method(Map data) 

Однако этот код успешно компилируется в Java 6, но не компилировать Java 8.

Может кто-то пожалуйста, дайте мне знать, почему это могут быть скомпилированы под Java 6?

+0

Извините. Это была опечатка. Ред. – Kevin

+0

Да. Но он отлично компилируется с использованием Java 6. – Kevin

+0

Он также не компилируется под java 7. Я не смог попробовать с java 6. –

ответ

7

Он компилируется под Java 6, но не в Java 7 или Java 8.

Там была ошибка в Java 5 и Java 6, что было fixed in Java 7 (#6182950).

Этой ошибка страница ссылается на JLS, Section 8.4.8.3, который гласит:

Это ошибка во время компиляции, если объявление типа Т имеет метод члена m1 и существует метод м2, объявленные в T или надтипе от T, так что все следующее верно:

  • m1 и m2 имеют то же имя.

  • м2 доступны из T.

  • Подписи m1 не подсигнатура (§8.4.2) сигнатур м2.

  • Подпись m1 или какой-либо метод m1 переопределяет (прямо или косвенно) то же стирание, что и подпись m2 или некоторый метод m2 переопределяет (прямо или косвенно).

Ни один из методов имеет подсигнатуры другой, потому что ни один тип параметра, Map<String, Map<String, String>> и Map<String, String> является подтипом другого. Но у них такое же стирание, Map.

Он никогда не должен компилироваться, но ошибка Java была исправлена ​​для Java 7.

Смежные вопросы