我使用类型约束来表示类型A
和B
必须相同。下面,我可以隐式地从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
*/
}
答案 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
类中定义不需要此类约束的其他方法/函数。