Для чего используется знак вопроса «?» И двоеточие «:» Оператор? [Дубликат]
Два вопроса об использовании вопросительного знака «?» и двоеточие «:» в круглых скобках функции печати: что они делают? Кроме того, кто-нибудь знает стандартный термин для них или где я могу найти больше информации об их использовании? Я читал, что они похожи на оператор if if else.
7 ответов
Это тернарный условный оператор, который можно использовать где угодно, а не только оператор печати. Его иногда называют просто «тройным оператором», но он не единственный тройной оператор, самый распространенный.
Вот хороший пример из Википедии, демонстрирующий, как это работает:
Традиционная конструкция if-else в C, Java и JavaScript написана:
Это можно переписать в следующем выражении:
В основном он принимает форму:
Итак, если логическое утверждение истинно, вы получаете первую часть, а если она ложна, вы получаете вторую.
Обобщения Java – неограниченные подстановочные знаки
Вопросительный знак (?), Представляет подстановочный знак, обозначает неизвестный тип в обобщениях. Могут быть случаи, когда любой объект может использоваться, когда метод может быть реализован с использованием функциональных возможностей, предоставляемых в классе Object, или когда код не зависит от параметра типа.
Чтобы объявить параметр Unbounded Wildcard, перечислите? только.
пример
В следующем примере показано, как extends используется для указания неограниченного подстановочного знака.
What does the question mark in Java generics' type parameter mean? [duplicate]
This is a small snippet of code taken from some of the examples that accompany the Stanford Parser. I’ve been developing in Java for about 4 years, but have never had a very strong understanding of what this style of code is supposed to indicate.
I’m not worried about the details of the code. What I’m confused about is what exactly the generic expression is supposed to convey, in English.
Can someone explain this to me?
6 Answers 6
means «A class/interface that extends HasWord .» In other words, HasWord itself or any of its children. basically anything that would work with instanceof HasWord plus null .
In more technical terms, ? extends HasWord is a bounded wildcard, covered in Item 31 of Effective Java 3rd Edition, starting on page 139. The same chapter from the 2nd Edition is available online as a PDF; the part on bounded wildcards is Item 28 starting on page 134.
Update: PDF link was updated since Oracle removed it a while back. It now points to the copy hosted by the Queen Mary University of London’s School of Electronic Engineering and Computer Science.
Update 2: Lets go into a bit more detail as to why you’d want to use wildcards.
If you declare a method whose signature expect you to pass in List<HasWord> , then the only thing you can pass in is a List<HasWord> .
However, if said signature was List<? extends HasWord> then you could pass in a List<ChildOfHasWord> instead.
Note that there is a subtle difference between List<? extends HasWord> and List<? super HasWord> . As Joshua Bloch put it: PECS = producer-extends, consumer-super.
Тернарный оператор Java – примеры
Тернарный оператор Java функционирует как упрощенный оператор Java if. Состоит из условия, которое оценивается как истинное или ложное, плюс значение, которое возвращается, если условие истинно, и другое значение, если ложно. Вот простой пример тернарного оператора:
Часть условия вышеупомянутого выражения:
Условие является выражением Java, которое оценивается как true или false. Приведенное выше условие будет иметь значение true, если переменная case равна верхнему значению Java String, и значение false, если нет.
Условием может быть любое выражение, которое оценивается как логическое значение, так же как выражения, которые вы можете использовать внутри оператора if – или while.
Значения
За условной частью следует знак вопроса (?). После него находятся два значения, которые может возвращать оператор, разделенные двоеточием (:):
Часть значений состоит из двух значений. Первое значение возвращается, если часть условия (см. выше) имеет значение true, второе – false.
В приведенном выше примере:
- Если case.equals (“uppercase”) имеет значение true, тогда выражение в целом возвращает строковое значение JOHN.
- Если case.equals (“uppercase”) имеет значение false, то выражение троичного оператора в целом возвращает строковое значение john.
Это означает, что имя переменной String в конечном итоге будет иметь значение JOHN или john в зависимости от того, будет ли выражение case.equals (“uppercase”) иметь значение true или false.
Возвращаемые значения могут быть результатом любого выражения Java, которое возвращает значение, присвоенное переменной в начале оператора. Поскольку переменная в начале примера в верхней части этой статьи имеет тип String, значения, возвращаемые части values, должны иметь тип String.
Использование в качестве нулевой проверки
Можно использовать оператор в качестве сокращения для нулевых проверок перед вызовом метода объекта:
Это эквивалентно, но короче, чем этот код:
Оба этих примера кода избегают вызова object.getValue(), если ссылка на объект равна нулю, но первый пример кода немного короче и элегантнее.
Использование в качестве максимальной функции
Вы можете достичь той же функциональности, что и функция Java Math max(), используя тернарный оператор:
Обратите внимание, как условия проверяют, больше ли значение val1 или равно значению val2. Если это так, тернарный оператор возвращает значение val1. В противном случае он возвращает значение val2.
В качестве функции min
Может использоваться для достижения того же эффекта, что и функция Java Math min():
Обратите внимание, как условия проверяют, меньше ли значение val1 или равно значению val2. Если это так, оператор возвращает значение val1. В противном случае он возвращает значение val2.
Как функция abs
Может использоваться для достижения того же эффекта, что и функция Java Math abs():
Связывание
Можно связать несколько троичных операторов вместе. Это достигается тем, что одно из значений, возвращаемых оператором, является другим троичным оператором. Вот пример:
- Условие первого оператора проверяет, является ли входная строка нулевой. Если это так, он немедленно возвращает 0. Если входная строка не равна нулю – значение второго троичного оператора.
- Второй оператор проверяет, равна ли входная строка пустой строке. Если это так, он немедленно возвращает 0. Если входная строка не равна пустой строке – значение Integer.parseInt (input).
Вы можете связывать и вкладывать тернарные операторы столько, сколько хотите, при условии, что каждый из них возвращает одно значение и используется вместо одного значения.
Конечно, вы могли бы упростить приведенный выше пример. Вместо цепочки могли бы объединить два условия, которые возвращают 0, в одно, например:
Однако это возможно только потому, что значение null и пустая строка возвращают одно и то же значение (0).