Kann ein impliziter Parameter für einen Typ B aufgelöst werden, wenn für seinen Super-Typ A ein implizites definiert ist? HierImplizite Parameter vom Super-Typ auflösen
ist ein Beispiel:
Ich habe eine Enumerable typeclass:
trait Enumerable[A] {
def name(a: A): String
def list: List[A]
//... other methods
}
object Enumeration {
def name[A, T >: A](a: A)(implicit ev: Enumerable[T]) = ev.name(a)
def list[T](implicit ev: Enumerable[T]) = ev.list
// ...
}
Dann definiere ich eine Instanz von enumerable:
sealed trait Season
case object Winter extends Season
case object Spring extends Season
case object Summer extends Season
case object Fall extends Season
implicit val seasonEnumerable = new Enumerable[Season] {
override def list: List[Season] = List(Winter, Spring, Summer, Fall)
}
// working :
Enumeration.name(Winter: Season) shouldBe "winter"
// faling :
Enumeration.name(Winter) shouldBe "winter"
Enumeration.name (Winter) ist versagt, wenn Ich sage Scalac nicht, dass der Winter eine Jahreszeit ist. Ich habe angegeben, dass der implizite Parameter in der "Name" -Methodensignatur ein Supertyp von A ist, aber es ist nicht ausreichend ...
Gibt es einen besseren Weg, dies zu tun?
In der Tat! Danke :) Könnten Sie den Unterschied zwischen definieren def name [A] (a: A) (implizit ev: Enumerable [_>: A]) = ev.name (a) und def name [A, T>: A] (a: A) (implizit ev: Enumerable [T]) = ev.name (a)? – Loic
Ich habe die Antwort erweitert. –