类型中的多个类型参数

时间:2016-06-23 02:29:29

标签: scala typeclass

我想使用类型类来设计转换接口,代码如下:

case class Kilograms(value: Double)

case class Pounds(value: Double)

trait Convert[T, U] {
  def convert(input: T): U
}

object Convert {
  def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]
  def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input)

  implicit object kilogramsToPounds extends Convert[Kilograms, Pounds] {
      override def convert(input: Kilograms): Pounds = Pounds(input.value *   2.20462)
    }

  implicit object poundsToKilograms extends Convert[Pounds, Kilograms] {
      override def convert(input: Pounds): Kilograms = Kilograms(input.value / 2.20462)
    }
}

但编译错误:

Error: wrong number of type arguments for A$A95.this.Convert, should be 2
 def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

 Error: could not find implicit value for parameter e: A$A95.this.Convert[T,U]
  def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

Error: not enough arguments for method implicitly: (implicit e:   A$A95.this.Convert[T,U])A$A95.this.Convert[T,U].
Unspecified value parameter e.
   def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

如果我将def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]更改为def apply[T, U](implicit c: Convert[T, U]): Convert[T, U] = c,则无编译错误!!!

我想知道发生了什么? 另外,我查找一些信息,上下文限制是用单一类型参数(?)限制的 如果我想实现多个类型参数类型类,我该怎么办?

1 个答案:

答案 0 :(得分:5)

上下文绑定语法T : U仅适用于只有一个类型参数 U的类型S(符合T

这是有效的,因为您手动声明隐含的Convert[T, U]

def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input)

以下内容无效,因为编译器分别对Convert[T]Convert[U]的上下文边界进行去糖,这是没有意义的。

 def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

(尝试脱糖)

 def apply[T, U](implicit ev1: Convert[T], ev2: Convert[U]) = ...

请参阅SLS 7.4 - Context and View Bounds

  

方法或非特征类的类型参数A也可能具有一个或多个上下文边界A : T。在这种情况下,类型参数可以被实例化为任何类型S,在S满足绑定T的实例化点处存在证据。此类证据包含T[S]类型的隐含值。