一旦类型参数进入图片,无形状中的类型不等式似乎不安全。
例如,以下代码编译
def someMethod[T](in : T) = {
implicitly[T =:!= String]
// some operation that requires T not String could be called here
// even though there is no guarantee that this is safe
}
val a = someMethod("abc") // here we have just proven String != String
我的直觉是正确的行为应该是编译时错误(我们已经生成了String =!:= String
)
这与=:!=
运算符无关,但与使用隐式冲突模拟否定运算符的所有情况无关。
这真的是一个错误还是我错过了一个重点?
答案 0 :(得分:2)
这是一个错误,或者至多是一个令人惊讶的错误。
答案 1 :(得分:1)
T =:!= String
需要是someMethod
的隐含参数。我们需要在呼叫网站上收集T
不是String
的证据,否则为时已晚。 T
内的someMethod
被删除。
def someMethod[T](in : T)(implicit ev: T =:!= String) = {
println("Definitely not a string")
}
scala> someMethod("abc")
<console>:16: error: ambiguous implicit values:
both method neqAmbig1 in package shapeless of type [A]=> shapeless.=:!=[A,A]
and method neqAmbig2 in package shapeless of type [A]=> shapeless.=:!=[A,A]
match expected type shapeless.=:!=[String,String]
someMethod("abc")
^