Вы определили от foobar
до быть неявным значением типа Unit
. Затем вы определили это как неявное значение типа Unit
. Думая об этом так:
implicit def foobar: Unit = implicitly[Unit]
// you've defined foobar as the implicit value for Unit.
// so implicitly[Unit] is the same as calling foobar
// which is the same as:
implicit def foobar: Unit = foobar
Вы не должны быть более удивлены, что это вызывает переполнение стека, чем вы были бы с этим оператором:
def tharSheBlows: Unit = tharSheBlows
Для чего-то с немного большей элегантностью, я бы использовал границы представления , чтобы гарантировать, что тип параметра равен Ordered
.
scala> abstract class Foo[Repr_Tpe <% Ordered[Repr_Tpe]] {}
defined class Foo
scala> class Bar extends Foo[Long] {}
defined class Bar
scala> case class Unordered(data: String)
defined class Unordered
scala> class Bam extends Foo[Unordered] {}
<console>:10: error: No implicit view available from Unordered => Ordered[Unordered].
class Bam extends Foo[Unordered] {}
^
scala> implicit def bringOrder(u: Unordered) = new Ordered[Unordered] { def compare(that: Unordered) = u.data.compareTo(that.data) }
bringOrder: (u: Unordered)java.lang.Object with Ordered[Unordered]
scala> class Bam extends Foo[Unordered] {}
defined class Bam