Почему дженерики полностью отключены, когда вы игнорируете тип параметра?

В качестве продолженияэтот вопроссначала фон

Дан класс с этим объявлением:

<code>public class SomeClass<T>
</code>

И подкласс, который не использует универсальный параметр:

<code>public class SomeSubClass extends SomeClass
</code>

Метод в SomeClass объявлен следующим образом:

<code>protected Map<String, Object> getMap(Object param) {
}
</code>

Если подкласс вызывает метод следующим образом:

<code>Map<String, Object> val = getMap(param);
</code>

Компилятор по существу жалуется на то, что getMap возвращает простую карту и существует непроверенное назначение обобщенной карте. Почему это так? Это документированные ожидания с Generics, и есть ли причина для этого?

 Steve Kuo24 июн. 2009 г., 22:39
Связанный вопрос с хорошим объяснениемstackoverflow.com/questions/449103
 Yishai24 июн. 2009 г., 21:48
Если вы посмотрите на связанный вопрос, у вас есть реальный пример.stackoverflow.com/questions/1039658/…
 Justin Niessner24 июн. 2009 г., 21:46
Можете ли вы опубликовать точное исключение и пример реального кода? Трудно точно определить, что вы опубликовали.

Ответы на вопрос(2)

однако, что вы всегда можете избавиться от ошибки, не создавая проблем, расширяяSomeClass<Object> вместоSomeClass:

public class SomeSubClass extends SomeClass<Object> {
    ...
}
 24 июн. 2009 г., 22:43
Верно, но если вы назначаете универсальный объект, ваш класс должен быть универсальным. Ваш компилятор Java выдаст предупреждение об этой строке, и это справедливо.
 24 июн. 2009 г., 22:11
В основном верно, но не совсем. Для выражения типа "SomeClass & lt; String & gt;" obj = new SomSubClass () ', выражение допустимо при использовании необработанного супертипа, но недопустимо при использовании SomClass & lt; Object & gt; как супертип.
Решение Вопроса

Спецификация языка Java JLS S4.8:

The superclasses (respectively, superinterfaces) of a raw type are the erasures of the superclasses (superinterfaces) of any of its parameterized invocations.

Учитывая, что крайне не рекомендуется использовать типы Raw в новом коде, они хотели просто определить правила взаимодействия между типами Raw и параметризованными типами.

 25 июн. 2009 г., 01:23
Я думаю, что для обоснования этого нужно что-то подобное, для этого потребуется много неясных правил + необработанные типы не следует поощрять.

Ваш ответ на вопрос