我有一个像这样的泛型类,我只想在T为Int时调用函数“one”。
class A[T] {
def one[T <: Int] = 1
}
val a = new A[String]
a.one
但这会编译。
我发现我可以这样做:
class A[T] {
def one(implicit ev: T <:< Int) = 1
}
val a = new A[String]
a.one
<console>:14: error: Cannot prove that String <:< Int.
为什么?
答案 0 :(得分:3)
在第一种情况下,您有两个不同且不相关的 T
参数:一个在类上,另一个在方法上。因此,当您致电a.one
时,one
&#39; T
为Int
。
在第二种情况下,one
没有自己的T
参数,因此在T <:< Int
中您有A
&#39; s {{1} }。当您致电T
时,a.one
&#39; A
为T
且不满足约束。