Как выразить (неявный conv: String => A) в качестве границы представления - PullRequest
3 голосов
/ 24 августа 2011

Я спрашиваю себя, какой будет граница вида, эквивалентная

(implicit conv: String => A)

Моя первая попытка состояла в том, чтобы просто объявить параметр типа A следующим образом:

[String <% A]

Нокомпилятор Scala жалуется на "не найдено: тип A" .

Есть предложения?

Ответы [ 2 ]

8 голосов
/ 24 августа 2011

- Исправленное сообщение -

Синтаксис [B <% A] фактически связывает новый тип B.Так что

class Foo[A, String <% A]

эквивалентно

class Foo[A, String](implicit $conv: String => A)

, где String - параметр произвольного типа, а не класс, о котором вы думаете.

Я думаю, чтоИменованное неявное преобразование является, вероятно, вашим лучшим вариантом,

class Foo[A](implicit conv: String => A)

, где теперь тип String не затенен.

Сводка: границы просмотра полезны в качестве преобразований из введенный параметр типа, а не до параметр типа.

2 голосов
/ 24 августа 2011

Это не предел просмотра.Ограничение вида говорит о том, что параметр типа A ограничен в том смысле, что его можно просматривать (преобразовывать в) как тип B.То, что у вас есть инвертированный тип и параметр типа, поэтому он не подходит.

Чтобы прояснить ситуацию, bound - это ограничение для «свободного» типа - параметра типа,Например:

type A <: String // A has an upper bound
type A >: String // A has a lower bound

Таким образом, ограничение view также является пределом, который накладывается с помощью совершенно другого механизма.Как таковой, он может быть наложен только на параметр типа, но не на тип.

Конечно, высказывание, что String => A должен существовать, также является своего рода связью, но не такой, которая имеет имя или синтаксический сахар для.

...