Scala类型参数Demo代码

小灰灰 2022-04-13 08:43 327阅读 0赞
  1. package com.zjw.ch18
  2. import scala.reflect.ClassTag
  3. object Ch18Test extends App {
  4. /** * 泛型方法 */
  5. def getMiddle[T](array: Array[T]): T = {
  6. array(array.length / 2)
  7. }
  8. println(getMiddle(Array(1, 2, 3, 4, 5, 6, 7)))
  9. /** * 类型变量上界界定 */
  10. def compare1[T <: Comparable[T]](first: T, second: T): Int = {
  11. first.compareTo(second)
  12. }
  13. class Person4{
  14. def show(): Unit = { }
  15. }
  16. class Student4 extends Person4 {
  17. override def show(): Unit = {
  18. println("Hello I'm Student4 instance.")
  19. }
  20. }
  21. println(compare1("abc", "acb"))
  22. def showFunc[T <: Person4](instance: T): Unit = {
  23. instance.show()
  24. }
  25. showFunc(new Student4)
  26. /** * 类型变量下界界定 */
  27. class Pair1[T](val first: T, val second: T) {
  28. def replaceFirst[R >: T](newFirst: R) = new Pair1[R](newFirst, second)
  29. }
  30. /** * 视图界定 */
  31. def comapre2[T <% Comparable[T]](first: T, second: T): Int = {
  32. first.compareTo(second)
  33. }
  34. println(comapre2(4332, 345))
  35. /** * 上下文界定 */
  36. def smaller[T: Ordering](first: T, second: T)(implicit ordering: Ordering[T]): T = {
  37. if (ordering.compare(first, second) < 0) {
  38. first
  39. } else {
  40. second
  41. }
  42. }
  43. println(s"smaller is: ${smaller(3,6)}")
  44. def signal[T : Ordering](a: T, b: T): Int = implicitly[Ordering[T]].compare(a, b)
  45. println(s"signal(0, 5) result is: ${signal(0, 5)}")
  46. /** * ClassTag上下文界定 */
  47. def mkPairArray[T: ClassTag](first: T, second: T): Array[T] = {
  48. Array[T](first, second)
  49. }
  50. println(mkPairArray(2, 3).mkString(","))
  51. /** * T协变 */
  52. class Animal1 { }
  53. class Bird1 extends Animal1 { }
  54. class Covariant[+T](t: T) { }
  55. val cov = new Covariant[Bird1](new Bird1)
  56. val cov2: Covariant[Animal1] = cov
  57. class Person3
  58. class Student3 extends Person3
  59. class Pair2[+T](val first: T, val second: T)
  60. def mkFriends(p: Pair2[Person3]): Unit = {
  61. println("Hello I'm covariant.")
  62. }
  63. val pairStudent: Pair2[Student3] = new Pair2(new Student3, new Student3)
  64. mkFriends(pairStudent)
  65. /** * T逆变 */
  66. class Animal2 { }
  67. class Bird2 extends Animal2 { }
  68. class Contravariant[-T](t: T) { }
  69. val c: Contravariant[Animal2] = new Contravariant[Animal2](new Animal2)
  70. val c2: Contravariant[Bird2] = c
  71. trait Friend[-T] {
  72. def befriend(someone: T)
  73. }
  74. class Person2 extends Friend[Person2] {
  75. override def befriend(someone: Person2): Unit = {
  76. println("friend , I'm Person2")
  77. }
  78. }
  79. class Student2 extends Person2 {
  80. override def befriend(someone: Person2): Unit = {
  81. println("friend , I'm Student2")
  82. }
  83. }
  84. def mkFriendWith(s: Student2, f: Friend[Student2]): Unit = {
  85. f.befriend(s)
  86. }
  87. val susan = new Student2
  88. val fred = new Person2
  89. mkFriendWith(susan, fred)
  90. }

发表评论

表情:
评论列表 (有 0 条评论,327人围观)

还没有评论,来说两句吧...

相关阅读

    相关 13.Scala-类型参数

    第13章 类型参数 13.1 泛型类 类和特质都可以带类型参数,用方括号来定义类型参数,可以用类型参 数来定义变量、方法参数和返回值。带有一个或多个类型参数的...

    相关 scala array类型参数

    在Scala中,数组(Array)是一种用于存储相同类型元素的数据结构。数组可以用于保存基本数据类型和自定义数据类型的元素。当定义数组类型参数时,您通常是在函数、类或方法签名中

    相关 Scala类型参数(一)

    Scala类型参数(一) 类型参数是对泛型的范围进一步的界定,那么介绍类型参数之前先聊聊泛型。Scala类型参数。类型参数是对泛型的范围进一步的界定,那么介绍类型参数之前

    相关 Scala类型参数

      类型参数是什么?  类型参数其实就类似于Java中的泛型。也是定义一种类型参数,比如在集合,在类,在函数中, 定义类型参数,然后就可以保证使用到该类型参数的地方,就

    相关 Scala中的类型参数

    类型参数是什么?类型参数其实就类似于Java中的泛型。先说说Java中的泛型是什么,比如我们有List a = new ArrayList(),接着a.add(1),没问题,a