Причина этого в том, что 2
является объектом, поэтому если вы пишете 2.<
или 2 <
(которые на самом деле одинаковы в Scala), то вы вызываете метод <
для объекта 2
.
Если вы просто напишите <
или >
, компилятор будет искать такой метод в локальной области, но не найдет его. Аналогично, для написания > 3
компилятору нужен доступный метод >
, которого нет.
Вы также можете увидеть это поведение непосредственно в консоли:
scala> 3.<
<console>:8: error: ambiguous reference to overloaded definition,
both method < in class Double of type (x: Char)Boolean
and method < in class Double of type (x: Short)Boolean
match expected type ?
3.<
^
Как видите, существует несколько определенных импликов, которые превращают 3
в объект класса, который определяет метод <
. Так что это работает в принципе, но не может стоять самостоятельно. Это работает, однако, если у вас есть больше информации о типе, как в вашем примере.
Сравните это со следующим:
scala> <(3)
<console>:8: error: not found: value <
<(3)
^
Здесь вы можете увидеть компилятор, который ищет где-то автономный <
. Обратите внимание, что в сообщении об ошибке указано значение, но это все равно означает, что это может быть функция, поскольку тип значения может быть (Int, Int) => Boolean
или что-то в этом роде.