Определите и опишите общие ограничения типа Scala - PullRequest
45 голосов
/ 02 февраля 2011

Я видел <:, >:, <% и т. Д. Может ли кто-нибудь дать (или найти) хорошее описание этого? Каковы возможные ограничения, что они делают, и каков пример того, когда их использовать?

Ответы [ 2 ]

67 голосов
/ 02 февраля 2011

S <: T означает, что S является подтипом T.Это также называется верхняя граница типа .Точно так же S >: T означает, что S является супертипом T, нижняя граница типа .

S <% T является границей представления и выражает, что S должену меня есть представление , которое отображает его значения в значения типа T.

Это также сбивает меня с толку, и у меня есть магистры по языкам программирования из Беркли.

54 голосов
/ 02 февраля 2011

Здесь есть два разных зверя, но все они известны как "границы", а не как "ограничения" ...

Сначала идут границы типов:

  • <: - ограниченный тип 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разрешает один блок, помеченный как неявный для любой функции или конструктора.

Если вам нужно использовать свои собственные имплициты, то сначала вы должны вручную преобразовать любые такие границы в несушированную версию и добавить это в неявный блок.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...