代码之家  ›  专栏  ›  技术社区  ›  Eugene Yokota

隐式转换对任何一个都有效吗?

  •  1
  • Eugene Yokota  · 技术社区  · 15 年前

    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]

    1 回复  |  直到 15 年前
        1
  •  0
  •   Eugene Yokota    15 年前

    Any . 我尝试使用 Manifest 任何 进入之内 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) }
    
    推荐文章