троичный оператор java - PullRequest
4 голосов
/ 05 июля 2010

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

Collection c = (5 == 5) ? new ArrayList() : new HashSet();

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

Несовместимые типы условных операндов ArrayList и HashSet

По причинам, которые я не понимаю, следующее устраняет проблему

Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();

Я использую Java 1.4.

Ответы [ 2 ]

7 голосов
/ 05 июля 2010

Это ошибка в 1.4 и исправлена ​​в соответствии с отчет об ошибке 5080917 .

Оценка Это ошибка.

ххххх @ ххххх 2004-07-30

3 голосов
/ 06 июля 2010

Даниэль более или менее получает это право, но удалил свой ответ (пятью голосами против).

Соответствующая цитата из 2nd Ed JLS (1.2-1.4)

  • Если второй и третий операнды различных ссылочных типов, то это должно быть возможно преобразовать один из типы к другому типу (вызов этот последний тип T) по присваиванию преобразование (§5.2); тип условным выражением является Т. Это ошибка времени компиляции, если ни один из типов назначение совместимо с другим тип.

Один из типов должен быть преобразован в другой, что неверно для ArrayList и HashSet, но верно для Collection и HashSet и ArrayList и Collection.

В 3-м издании JLS (1,5 +)

  • В противном случае второй и третий операнды имеют типы S1 и S2 соответственно. Пусть T1 будет типом, который результаты от применения бокса преобразование в S1, и пусть T2 будет тип, который является результатом применения преобразование бокса в S2. Тип условное выражение является результат применения захвата преобразования (§5.1.10), чтобы смазать (T1, T2) (§15.12.2.7).

Это делает очевидную вещь, которую, как оказалось, сложнее определить и реализовать (я случайно натолкнулся на раннюю версию javac, которая вылетала на нем, когда одним из выражений было void). IIRC, эта работа была проделана как часть дженериков.

...