Понял. Это на самом деле не ошибка, как ни странно.
С раздел 4.8 (необработанные типы) JLS :
Тип конструктора (§8.8),
метод экземпляра (§8.8, §9.4) или
нестатическое поле (§8.3) M необработанного
тип C, который не наследуется от его
суперклассы или суперинтерфейсы является
стирание своего типа в общем
декларация, соответствующая C.
тип статического члена необработанного типа
C такой же, как его тип в
общая декларация, соответствующая
C.
Таким образом, даже несмотря на то, что сигнатура типа метода не использует какие-либо параметры типа самого класса, стирание типа включается, и сигнатура становится эффективной
public Map getMap()
Другими словами, я думаю, что вы можете представить, что необработанный тип является тем же API, что и универсальный тип, но со всеми <X>
битами, удаленными из везде (в API, а не в реализации).
РЕДАКТИРОВАТЬ: Этот код:
MyClass unchecked = new MyClass();
Map<String, String> map = unchecked.getMap(); // Unchecked warning, why?
String s2 = map.get("");
компилируется, потому что существует неявное, но неконтролируемое преобразование из необработанного типа Map
в Map<String, String>
. Вы можете получить тот же эффект, сделав явное преобразование (которое ничего не делает во время выполнения) в последнем случае:
// Compiles, but with an unchecked warning
String x = ((Map<String, String>)fail.getMap()).get("");