• scala 上下文绑定、ClassTag、TypeTag、ClassManifest、Manifest


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

    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")))
      }
    }
  • 相关阅读:
    php 导出csv文件
    dns 服务器配置
    ettercap ARP dns 欺骗
    for循环内 执行$ajax(){}
    js 如何生成二维数组
    jquery读取csv文件并用json格式输出
    echo 换行
    cmd命令运行php,php通过cmd运行文件
    Git 常用命令整理
    图像裁剪插件
  • 原文地址:https://www.cnblogs.com/wudeyun/p/14811598.html
Copyright © 2020-2023  润新知