如何对我的Interpreter中使用的类型进行隐式转换

时间:2010-06-23 14:44:20

标签: scala types implicit

我正在编写一个解释器并试图使用how-to-set-up-implicit-conversion-to-allow-arithmetic-between-numeric-types的解决方案来解决我需要添加布尔+布尔值,Int +布尔值,布尔+ Int,Int + Double,Double + Double等相同的问题

所以我使用了该解决方案中的WeakConformance和C类

sealed trait WeakConformance[A <: AnyVal, B <: AnyVal, C] {
  implicit def aToC(a: A): C

  implicit def bToC(b: B): C
}

object WeakConformance {
  implicit def SameSame[T <: AnyVal]: WeakConformance[T, T, T] = new WeakConformance[T, T, T] {
    implicit def aToC(a: T): T = a

    implicit def bToC(b: T): T = b
  }

  implicit def IntDouble: WeakConformance[Int, Double, Double] = new WeakConformance[Int, Double, Double] {
    implicit def aToC(a: Int) = a

    implicit def bToC(b: Double) = b
  }

  implicit def DoubleInt: WeakConformance[Double, Int, Double] = new WeakConformance[Double, Int, Double] {
    implicit def aToC(a: Double) = a

        implicit def bToC(b: Int) = b
      }
   }  

   case class C[A <: AnyVal](val value:A) {
          import WeakConformance.unify
          def +[B <: AnyVal, WeakLub <: AnyVal](that:C[B])(implicit wc: WeakConformance[A, B, WeakLub], num: Numeric[WeakLub]): C[WeakLub] = {  
        new C[WeakLub](num.plus(wc.aToC(x), wc.bToC(y)))
      }
    }

这是我的翻译的一部分

class Interpreter {

......

  def eval(e: Expression): Any = e match {
  ...

    case ADD(lhs, rhs) => (eval(lhs), eval(rhs)) match {

      case (l: C[_], r: C[_]) => l + r  // error comes here

      case _ => error("...")
    }
  }

}

错误就是那样

错误:含糊不清的隐含值://显示在Numeric特征中声明为隐含的2个最后对象,此处匹配预期类型Numeric[WeakLub]

任何想法如何让它发挥作用?我想让eval方法返回C,但由于C[Int]不是C[Any]的实例,因此无法解决我的问题

1 个答案:

答案 0 :(得分:1)

由于类型擦除,您无法在运行时检索C的类型参数。您需要使用清单来存储该信息。请参阅与清单和类型擦除相关的问题。