異なる型階層のいくつかのオブジェクトを、List[Any]
または同様のコンテナーに格納したいのですが、後で暗黙的な変換を実行して、型クラスのようなことを行います。以下に例を示します。
abstract class Price[A] {
def price(a: A): Int
}
trait Car
case class Prius(year: Int) extends Car
trait Food
case class FriedChicken() extends Food
object Def {
// implicit object AnyPrices extends Price[Any] {
// def price(any: Any) = 0
// }
// implicit object PriusPrices extends Price[Prius] {
// def price(car: Prius) = 100
// }
implicit object CarPrices extends Price[Car] {
def price(car: Car) = 100
}
implicit object FoodPrices extends Price[Food] {
def price(food: Food) = 5
}
}
def implicitPrice[A: Price](x: A) = implicitly[Price[A]].price(x)
import Def._
val stuff: List[Any] = List(Prius(2010), FriedChicken())
stuff map { implicitPrice(_) }
上記のコードは、次のようにエラーをスローします。
error: could not find implicit value for evidence parameter of type Price[Any]
stuff map { implicitPrice(_) }
^
のコメントを外すと、 が表示されAnyPrices
ますがList(0,0)
、それは私が期待しているものではありません。これを機能させるには、マニフェストをリストに保存する必要がありますか?
また、それが欲しくて十分ではないList(Prius(2010)) map { implicitPrice(_) }
ため、どちらも機能しません。より柔軟にする方法はありますか?Price[Prius]
Price[Car]