Как выразить (неявный conv: String => A) в качестве границы представления
Я спрашиваю себя, какой будет точка зрения, эквивалентная
(implicit conv: String => A)
Моей первой попыткой было просто объявить параметр типа A
следующее:
[String <% A]
Но компилятор Scala жалуется на "not found: type A".
Какие-либо предложения?
2 ответа
Это не точка зрения. Граница представления говорит о том, что параметр типа A
ограничен в том, что его можно рассматривать (преобразовывать в) как тип B
, То, что у вас есть инвертированный тип и параметр типа, поэтому он не подходит.
Чтобы было понятнее, ограничение - это ограничение для "свободного" типа - параметра типа. Например:
type A <: String // A has an upper bound
type A >: String // A has a lower bound
Таким образом, граница представления также является пределом, который накладывается с помощью совершенно другого механизма. Как таковой, он может быть наложен только на параметр типа, но не на тип.
Конечно, говоря String => A
"Должен существовать" - это тоже вид привязки, но не тот, для которого есть название или синтаксический сахар.
- Пересмотренный пост -
Синтаксис [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
не затенен
Сводка: границы представления полезны для преобразования введенного параметра типа, а не параметра типа.