Есть ли в Scala что-то похожее на границы вида, но которые могут соответствовать подтипам?
Поскольку представления в Scala не объединяются, в настоящее время у меня есть следующее:
implicit def pimpIterable[A, I[_]](x: I[A])(implicit f: I[A] => Iterable[A]) =
new { def mylength = x.size }
Позвольте мне написать:
Array(1,2,3).mylength
Seq(1,2,3).mylength
Представленная выше форма представляется необходимой, поскольку, если я попытаюсь упростить сигнатуру своей функции с помощью чего-то вроде:
implicit def pimpIterable[A, I <% Iterable[A]](x: I) =
new { def mylength = x.size }
тогда неявное преобразование не будет работать для массивов, поскольку нет прямого представления массива в Iterable (только для подкласса Iterable, который может найти первая форма).
Это также приводит к тому, что все другие короткие руки также записываются в полной форме. Что могло бы быть:
implicit def pimpIterable[A: Scalar, I <% Iterable[A]](x: I) = ...
теперь должно быть записано как:
implicit def pimpIterable[A, I[_]](x: I[A])(implicit f: I[A] => Iterable[A], m: Scalar[A]) = ...
Есть ли лучший путь?