上下文边界是隐式泛型参数的语法糖,这些参数由您正在使用的某种类型参数化。这个概念也被称为“类型类”。您定义一些通用特征,例如您的Sample[T]
,然后为 的各种具体值提供该特征的隐式(!)实例T
。我们称它们为“类型类实例”。
为什么是隐含的?这是Scala用来实现类型类机制的一个实现细节;类型类也存在于例如 Haskell 中,但机制本身有点不同。无论如何,您可以定义一个方法,例如您的方法,该方法def method
需要某种类型的类型类实例。您可以使用上下文绑定语法,或者使用更详细和更明确的隐式参数标准语法来做到这一点。
您的定义是使用上下文绑定。但是如编译错误所示,您的示例有问题。让我们首先看一个正确使用类型类概念的正确示例。
// type class definition:
trait Sample[T] {
def getSample: T
}
// type class instance(s):
object Sample {
implicit val sampleInt: Sample[Int] =
new Sample[Int] { def getSample = 42 }
}
现在的用法:
import Sample._
// using the context bound syntax
def method1[T : Sample](t: T) = t.getSample
// not using the context bound syntax
def method2(t: T)(implicit ev: Sample[T]) = t.getSample
我们所做的是说 - t
type有一些值T
,我们对此知之甚少,但我们所知道的是有一个Sample
可用的类型类实例。这让我们可以做到t.getSample
。
现在,最终为您的问题提供答案:
在你的代码中,你把事情搞混了。你T
实际上被称为Int
. 您打算使用该Int
类型,但您所做的是您将泛型参数命名为Int
。我本可以用更少的文字来回答这个问题,但我想也许你会发现更大的图景很有趣,而不仅仅是指出错误。