=:=
应该是可交换的:A =:= B
暗示B =:= A
。我想知道是否有办法让scala理解这一点。详细说明,如果我使用
implicit def typeEqCommutes[A,B](ev: A=:=B): B=:=A = ev.asInstanceOf[B=:=A]提供scala,那么就有办法the following would compile:
class Pair[T, S](var first: T, var second: S) {
def swap(implicit ev: T =:= S) {
val temp = first
first = second //error: type mismatch; found: S required: T
second = temp
}
}
答案 0 :(得分:0)
嗯,它可能不完全是你所要求的,但你可以尝试更明确地暗示:
class Pair[T, S](var first: T, var second: S) {
def swap(implicit ev: T =:= S, commutative: S =:= T) {
val temp = first
first = commutative(second)
second = ev(temp)
}
}
找到S =:= T
的证据不应该是编译器的问题,因为=:=
证明的类型相同性确实应该是可交换的。
如果你想用隐式转换来做,你必须这样做:
implicit def commutativity[A, B](in: B)(implicit ev: A =:= B): A = {
in.asInstanceOf[A]
}
class Pair[T, S](var first: T, var second: S) {
def swap(implicit ev: T =:= S) {
val temp = first
first = second
second = ev(temp)
}
}
虽然,imho,不需要使用asInstanceOf
总是更好。