Что значит знак вопроса в java
Перейти к содержимому

Что значит знак вопроса в java

Что значит знак вопроса в java

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 71a9d5c2c9ff7723 • Your IP : 82.102.23.104 • Performance & security by Cloudflare

Что означает знак вопроса в параметре типа Java generics?

Это небольшой фрагмент кода, взятый из некоторых примеров, сопровождающих синтаксический анализатор Stanford. Я разрабатываю Java около 4 лет, но никогда не имел очень сильного понимания того, что должен указывать этот стиль кода.

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

может кто-нибудь объяснить это мне?

6 ответов

означает » класс / интерфейс, который расширяет HasWord .»Другими словами, HasWord себя или любого из своих детей. в основном все, что будет работать с instanceof HasWord плюс null .

в более технических терминах, ? extends HasWord ограничения по шаблону, покрытые пункту 31 эффективное Java 3rd Edition, начиная со страницы 139. Та же глава из 2-го издания — доступно онлайн в формате PDF; деталь, ограниченная маски-пункт 28 начиная с страница 134.

Update: ссылка PDF была обновлена, так как Oracle удалила ее некоторое время назад. Теперь он указывает на копию, размещенную в Лондонской школе электронной инженерии и компьютерных наук Университета Королевы Марии.

Update 2: Давайте рассмотрим немного подробнее, почему вы хотите использовать подстановочные знаки.

если вы объявите метод, подпись которого ожидает, что вы передадите List<HasWord> , тогда единственное, что вы можете пройти в List<HasWord> .

, если сказал, что подпись List<? extends HasWord> тогда вы могли бы пройти в .

обратите внимание, что существует тонкая разница между List<? extends HasWord> и List<? super HasWord> . Как выразился Джошуа блох: Печ = производитель-расширяется, потребитель-супер.

это означает, что если вы передаете коллекцию, из которой ваш метод извлекает данные (т. е. коллекция создает элементы для вашего метода), вы должны использовать extends . Если вы передаете коллекцию, в которую ваш метод добавляет данные чтобы (т. е. коллекция потребляет элементы, создаваемые вашим методом), она должна использовать super .

Лайфхаки: как писать код лучше и быстрее

Все команды в Java делятся на две категории: команды ( Statement ) и выражения ( Expression ). Про команду обычно говорят, что она выполняется , а про выражение — что оно вычисляется . Но это не главное.

Основное отличие между командой и выражением в том, что у выражения есть результат вычисления . И у этого результата, во-первых, есть тип, а во-вторых, этот результат можно куда-то присвоить, ну или использовать в каком-то другом выражении.

Код Примечания
int x; Команда
(a < 10) Выражение, тип boolean
i++; Выражение, тип совпадает с типом переменной i
x = 5; Выражение, тип совпадает с типом переменной x

И что это нам дает?

Во-первых, мы можем использовать тот факт, что очень много команд на самом деле являются выражением (имеют результат вычисления). Например, такой код будет работать:

Код Примечания

Во-вторых, мы можем игнорировать результат вычисления выражения, если хотим.

Код Код, где мы игнорируем результат:

Игнорировать результат вычисления выражения нужно, например, если выражение кроме результата делает еще что-то полезное, и нам это действие важно, а сам результат — нет.

2. Тернарный оператор

Этот лайфхак уже поинтереснее предыдущего. В Java есть специальный тернарный (тройной) оператор . Чем-то он похож на сокращенную запись оператора if–else :

Если условие истинно, то выполняется выражение1 иначе выполняется выражение2 . После условия следует знак вопроса , а два выражения разделены двоеточием .

Основное отличие тернарного оператора от оператора if-else в том, что тернарный оператор является выражением, а значит его результат можно чему-нибудь присвоить.

Например, мы хотим вычислить минимум двух чисел. С использованием тернарного оператора этот код будет выглядеть так:

Или, допустим, вам нужно присвоить переменной разные значения в зависимости от какого-то условия. Как это сделать?

Вариант первый — воспользоваться оператором if-else :

Второй вариант — использовать тернарный оператор , то есть сокращенную запись оператора if-else :

Так что же лучше использовать: оператор if-else или тернарный оператор ? С точки зрения скорости выполнения, особой разницы нет. Здесь скорее вопрос читаемости кода. И это очень важный момент: код должен не только правильно работать, но и легко читаться другими программистами.

Самый простой критерий может быть таким: если код помещается в одну строку — используйте тернарный оператор , если в одну строку он уже не помещается — лучше использовать if-else .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *