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

2

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

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

public class SomeClass<T>

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

public class SomeSubClass extends SomeClass

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

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

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

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

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

Связанный вопрос с хорошим объяснениемstackoverflow.com/questions/449103 Steve Kuo
Можете ли вы опубликовать точное исключение и пример реального кода? Трудно точно определить, что вы опубликовали. Justin Niessner
Если вы посмотрите на связанный вопрос, у вас есть реальный пример.stackoverflow.com/questions/1039658/… Yishai

Ваш Ответ

2   ответа
1

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

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

Спецификация языка 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 и параметризованными типами.

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

Похожие вопросы