Здесь есть два разных зверя, но все они известны как "границы", а не как "ограничения" ...
Сначала идут границы типов:
<:
- ограниченный тип uppper >:
- нижний предел типа
Они по сути такие же, как super
и extends
в Java, и фактически будут кодироваться кактакой в сгенерированном байт-коде, который хорош для взаимодействия:)
Затем следует синтаксический сахар:
<%
- просмотр границы :
-привязка к контексту
Они НЕ закодированы таким образом, чтобы Java могла их понять (хотя они представлены в подписи scala , аннотации, которую scala добавляет ко всем классам, чтобы помочькомпилятор, который, в конечном счете, станет основой библиотеки отражений Scala *
Оба они преобразуются в неявные параметры:
def fn[A <% B](arg: A) = ... //sugared
def fn[A](arg: A)(implicit ev: A => B) = ... //unsugared
def fn[A : Numeric](arg: A) = ... //sugared
def fn[A](arg: A)(implicit ev: Numeric[A]) = ... //unsugared
По этой причине вы не можете комбинировать свои собственныеподразумевает либо границы просмотра, либо границы контекста, только в Scalaразрешает один блок, помеченный как неявный для любой функции или конструктора.
Если вам нужно использовать свои собственные имплициты, то сначала вы должны вручную преобразовать любые такие границы в несушированную версию и добавить это в неявный блок.*