类型约束的相等性要求显式转换

时间:2013-10-20 18:48:58

标签: scala

我使用类型约束来表示类型AB必须相同。下面,我可以隐式地从A投射到B,但需要明确的演员从B转到A。这样做的正确方法是什么?

class Pair[A, B](var first: A, var second: B) {
  def swap()(implicit ev: A =:= B) {
    val tmp = second
    second = first
    first = tmp //won't compile without appending .asInstanceOf[A]
  }

  /*
  ...other methods like replaceFirst, replaceSecond that 
     don't require types A, B to be the same
  */
}

1 个答案:

答案 0 :(得分:2)

A =:= B见证A类型等于B类型。然后,您必须告诉编译器B类型等于A类型。使用 B =:= A :)

执行此操作

见下文介绍了新的 ev2 参数:

class Pair[A, B](var first: A, var second: B) {
  def swap()(implicit ev:  =:=[A,B], ev2:  =:= [B,A])  {
    val tmp = second
    second = first
    first = tmp
}
BTW:有些人建议:“只使用一个类型参数”。如果您遵循这种方式,您将无法在Pair类中定义不需要此类约束的其他方法/函数。