Использование += в троичном выражении Java

Я пытаюсь использовать универсальный тип с троичным выражением для выполнения выражений, которые не возвращают значение. Вот мой класс:

  static class Generic<T> {
    T t;
  }

  public static Generic generic = new Generic();

Я выполняю простую команду. Компилятор Java не выдает никаких ошибок для my_a += 1, но запрещает my_b += 1.

generic.t = X ? my_a += 1 : my_b += 1;

Мой вопрос: почему он не допускает второе выражение?

В основном это экспериментальный фрагмент кода. Я просто пытаюсь понять, как работает тернарный код в Java и почему я не могу использовать += в my_b += 1 .

код:

bool X = true;
int my_a = 0;
int my_b = 0;
generic.t = X ? my_a += 1 : my_b += 1;

Исключение:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
        Syntax error on token "+ = ", + expected

Изменение my_b += 1; на my_b++ успешно компилирует и выполняет код. Я ожидал, что код будет выполняться с my_b += 1;, поскольку универсальный тип предназначен для совместимости с различными типами данных.

Вы ничего не показали нам о my_a или my_b, и, похоже, вы создаете экземпляр необработанного типа Generic. Без минимально воспроизводимого примера сложно воспроизвести проблему самостоятельно или предложить изменение. (Лично я бы начал с удаления здесь любых общих аспектов. Трудно представить, как my_a += 1 вернет что-то совместимое с T, вообще...)

Jon Skeet 01.07.2024 14:56

Какие бывают типы my_a и my_b?

M. Ozn 01.07.2024 14:57

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

user85421 01.07.2024 15:00
public static Generic generic = new Generic(); - вы используете сырой тип, которого лучше избегать. Вы должны указать, например. public static Generic<Integer> generic = new Generic<>();
k314159 02.07.2024 23:32

Кроме того, вы говорите «выражения, которые не возвращают значение». На самом деле my_b += 1 действительно возвращает значение; это то же самое, что ++my_b, который является int. Например, вы можете сделать int my_c = (my_b += 1);

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

Ответы 1

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

Правила приоритета операторов здесь шаткие. Вам нужны скобки. Это отлично работает:

generic.t = X ? (my_a += 1) : (my_b += 1);

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