Как выразить (неявный 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 не затенен

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

Другие вопросы по тегам