我想将一些来自不同类型层次结构的对象存储到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]
不够好。有没有办法让它更灵活?