Java: объявление и экземпляр другого универсального типа

Я вижу, что вы должны использовать общую форму как при объявлении переменной, так и при назначении экземпляра. Я хочу задать следующий вопрос: Есть ли случай, когда тип переменной и экземпляр могут быть разными? Нравиться

List<Object> list = new ArrayList<Integer>();

Возможный дубликат Понижение в Java

yassadi 15.04.2018 09:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, вы можете использовать оператор ромба, чтобы определить тип справа:

List<Object> list = new ArrayList<>();

Is there any case the type of variable and instance can be different?

Универсальные типы в Java стираются во время выполнения. Это означает, что пример не имеет универсального типа. Тип существует только во время компиляции для переменной.

Общие типы слева и справа не обязательно должны быть одинаковыми, но тогда вы должны использовать подстановочные знаки:

List<?> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Integer>();

С помощью этих подстановочных знаков вы значительно ограничены в том, что еще можете делать с объектами. Например, вы можете только get или Number из List<? extends Number>, но вы не можете add новый Integer для него (потому что это мог быть List<Double>, насколько вы знаете).

Это по-прежнему полезно, если вы хотите написать методы, которые могут принимать списки определенного типа интерфейса:

boolean areAllPositive(List<? extends Number> numbers) { ... }

Не могли бы вы подробнее рассказать о подстановочных знаках в дженериках или дать полезную ссылку, на которую я могу сослаться?

Paco Kwon 16.04.2018 04:27

Возможно, начнем с официального руководства: docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Thilo 16.04.2018 09:30

Другие вопросы по теме