Итак, похоже, я не могу получить класс типов, когда объекты уменьшены до Any
. Моя попытка использовать Manifest
также потерпела неудачу, так как у меня, похоже, нет никакого способа бросить Any
в T
, даже если у меня есть объект Manifest[T]
.
import reflect.Manifest._
def add [A, B >: A](stuff: A, list: List[(B, Manifest[_])])(implicit m: Manifest[A]) = (stuff, m) :: list
val stuff2 = add(Prius(2000), add(FriedChicken(), Nil))
stuff2 map { x =>
val casted = x._2.erasure.cast(x._1)
implicitPrice(casted)
}
дает мне
error: could not find implicit value for evidence parameter of type Price[Any]
так что, похоже, мне нужно разрешить вещи в Price
, прежде чем я вставлю их в List
:
abstract class Price[A] {
def price(a: Any): Int
}
trait Car
case class Prius(year: Int) extends Car
trait Food
case class FriedChicken() extends Food
object Def {
implicit object PriusPrices extends Price[Prius] {
def price(car: Any) = 100
}
implicit object FriedChickenPrices extends Price[FriedChicken] {
def price(food: Any) = 5
}
}
import Def._
def add [A, B >: A](stuff: A, list: List[(B, Price[_])])(implicit p: Price[A]) = (stuff, p) :: list
val stuff = add(Prius(2000), add(FriedChicken(), Nil))
stuff map { x => x._2.price(x._1) }