scala 上下文绑定ClassTagTypeTagClassManifestManifest

Posted 一直小飞猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala 上下文绑定ClassTagTypeTagClassManifestManifest相关的知识,希望对你有一定的参考价值。

这两种函数定义是等价的:

def max[T](a:T, b:T) (implicit cp : A[T]) 
def max[T : A] (a:T, b:T)

[T : A] 是一个上下文绑定,意味着该 max 函数有一个类型为 A[T] 的隐式参数。

编译器会擦除泛型信息,为了获取泛型的类型信息元数据,Scala 引入 ClassTag、TypeTag、ClassManifest、Manifest 

类来解决这个问题。其中 ClassTag 是 ClassManifest 升级版,TypeTag 是 Manifest 升级版。先看下面的例子,[T: Ordering]

是一个上下文绑定,通过  implicitly[Ordering[T]] 拿到这个绑定的隐式参数 ord,然后比较大小。而 [T: ClassTag] 上下文绑定

,意味着有一个隐式参数,通过这个隐式参数,我们可以获取 T 的类型信息,解决编译器对泛型的擦除。

case class People(age: Int, name: String)

object People {
  implicit val ord: Ordering[People] = new Ordering[People]() {
    override def compare(x: People, y: People): Int = x.age - y.age
  }
}

object ContextBound {
  def max[T: Ordering](x: T, y: T): T = {
    val ord = implicitly[Ordering[T]]
    if (ord.gt(x, y)) x
    else y
  }

  def main(args: Array[String]): Unit = {
    println(max(10, 20))
    println(max("10", "20"))
    println(max(People(10, "a"), People(20, "b")))
  }
}

以上是关于scala 上下文绑定ClassTagTypeTagClassManifestManifest的主要内容,如果未能解决你的问题,请参考以下文章

任何类型上下文绑定

为啥视图绑定和上下文绑定无法检测到上下文中存在的隐含

3.使用闭包实现数据缓存

Scala 3 类型绑定 `<:<` 元组技巧

Scala多态性 - 协变和类型绑定

Scala:带有地图的期货,用于 IO/CPU 绑定任务的 flatMap