2010-07-05 6 views
4

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

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

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

Incompatible conditional operand types ArrayList and HashSet

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

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

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

+4

Обратите внимание, что первые компилируются на Java 1.5 и выше. – BalusC

+1

Прекрасно работает на моей машине JDK от Sun. 1.6.0_16 – MAK

+0

С точки зрения, но стоит спросить - похоже, что '5 == 5' не кажется странным никому, кроме меня. Насколько я понимаю, 'c' всегда будет оценивать' new ArrayList() '. Может ли кто-нибудь объяснить, почему было бы полезно делать 'Collection c = (5 == 5)? новый ArrayList(): новый HashSet(); 'вместо простого выполнения' Collection c = new ArrayList(); 'учитывая, что' (5 == 5) 'всегда оценивает' true'? –

ответ

7

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

Evaluation This is a bug.

[email protected] 2004-07-30

+0

+1 Вы правы. Я неправильно прочитал спецификацию и удалю свой ответ. – Daniel

+0

Это ошибка в 1.5 (тигр), зафиксированная в 1.6 (mustang). Это похоже на конкретный экземпляр правила, введенного в 1.5/3rd Ed JLS. –

+0

@ Даниэль Я думаю, что ваш ответ был почти там. –

3

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

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

  • If the second and third operands are of different reference types, then it must be possible to convert one of the types to the other type (call this latter type T) by assignment conversion (§5.2); the type of the conditional expression is T. It is a compile-time error if neither type is assignment compatible with the other type.

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

В 3 Ed JLS (1.5+)

  • Otherwise, the second and third operands are of types S1 and S2 respectively. Let T1 be the type that results from applying boxing conversion to S1, and let T2 be the type that results from applying boxing conversion to S2. The type of the conditional expression is the result of applying capture conversion (§5.1.10) to lub(T1, T2) (§15.12.2.7).

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

Смежные вопросы