经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
Scala Type Parameters 1
来源:cnblogs  作者:afewnotes  时间:2019/10/9 8:54:16  对本文有异议

类型参数

  • 表现形式:在名称后面以方括号表示, Array[T]
  • 何处使用
    • class 中,用于定义变量、入参、返回值

      1. class Pair[T, S](val first: T, val second: S)
      2. // scala 可自动推断具体的类型
      3. val p = new Pair(42, "String") // Pair[Int, String]
    • 函数、方法

      1. def getMiddle[T](a: Array[T]) = a(a.length / 2)
  • 类型边界

    • 上边界 T <: UpperBound

      1. // 比较大小
      2. class Pair[T](val first: T, val second: T) {
      3. def smaller = if (first.compareTo(second) < 0) first else second
      4. }

      无法确定 first 是否存在 compareTo 方法,所以必须添加约束,fist 必须是 Comparable 的子类型,即需要添加上边界

      1. class Pair[T <: Comparable[T]](val first: T, val second: T) {
      2. def smaller = if (first.compareTo(second) < 0) first else second
      3. }
    • 下边界 T >: LowerBound

      1. // 替换第一个元素
      2. class Pair[T](val first: T, val second: T) {
      3. def replaceFirst(newFirst: T) = new Pair[T](newFirst, second)
      4. }

      替换第一个元素为 T 的父类 R,那么返回类型是什么? 如果需要返回 R,则需要添加约束,即需要下边界;否则返回的类型为 Any

      1. // 返回类型自动推断为 new Pair[R]
      2. def replaceFirst[R >: T](newFirst: R) = new Pair(newFirst, second)
    • 上下文边界 T : ContextBound

      Scala 2.8 对 Array 进行了更新优化,使用隐式转换和 manifest 将数组整合为 Scala 的集合库

      1. def tabulate[T](len: Int, f: Int => T)(implicitm: ClassManifest[T]) = {
      2. val xs = new Array[T](len)
      3. for(i <- 0 until len) xs(i) = f(i)
      4. xs
      5. }
      6. // 简化后
      7. def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
      8. val xs = new Array[T](len)
      9. for(i <- 0 until len) xs(i) = f(i)
      10. xs
      11. }
      • ClassTag, 指定运行时的类型,如 Array[Int] 在运行时想指定为 int[]

        1. import scala.reflect._
        2. def makePair[T : ClassTag](first: T, second: T) = {
        3. val r = new Array[T](2); r(0) = first; r(1) = second; r
        4. }
        5. makePair(4, 9)
        6. // 实际调用
        7. makePair(4, 9)(classTag)
        8. // new 操作,即 ClassTag[Int] 构建原始类型数组 int[2]
        9. classTag.newArray
    • 多个边界
      • 可同时添加上界和下界 T >: Lower <: Upper
      • 不可添加多个上界或多个下届,但可实现多个 trait,
        • T <: Comparable[T] with Serializable with Cloneable
      • 可指定多个上下文边界 T : Ordering : ClassTag
  • 类型约束
    • 测试是否相等 T =:= U
    • 测试是否为子类 T <:< U
    • 测试是否可转换 T => U

    要添加该约束,需添加隐式参数

    1. // 约束类
    2. class Pair[T](val first: T, val second: T)(implicit ev: T <:< Comparable[T])
    3. // 约束方法调用,只有类型满足才能调用成功,否则报错
    4. class Pair[T](val first: T, val second: T) {
    5. def smaller(implicit ev: T <:< Ordered[T]) =
    6. if (first < second) first else second
    7. }
    8. // 便于类型推断
    9. def firstLast[A, C <: Iterable[A]](it: C) = (it.head, it.last)
    10. // 无法推断类型 A
    11. firstLast(List(1, 2, 3)) // [Nothing, List[Int]]
    12. // 添加约束关系
    13. def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last)

原文链接:http://www.cnblogs.com/yuanzam/p/11638643.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号