2017-01-23 115 views
2

我有一个这样的泛型类,我只想当T是Int时调用函数“one”。什么时候应该在scala中使用泛型类中的类型绑定?

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. 

为什么?

回答

3

在第一种情况下,您有两个不同且不相关的T参数:一个关于类,另一个关于方法。所以当你拨打a.one时,oneTInt

在第二种情况下one没有自己的T参数,所以在T <:< Int你有AT。当您致电a.one时,ATString,它不符合界限。