Даниэль более или менее получает это право, но удалил свой ответ (пятью голосами против).
Соответствующая цитата из 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, эта работа была проделана как часть дженериков.