有兴趣看视频

泛型方法

  1. package tcode.chapter11
  2. object $01_GenericMethod {
  3. /**
  4. * 泛型方法: def 方法名[T,U,](x:T):U = {..}
  5. */
  6. def main(args: Array[String]): Unit = {
  7. val arr = Array[Int](1,2,3)
  8. val arr2 = Array[String]("aa")
  9. println(getLength[String](arr2))
  10. }
  11. def getLength[T](arr:Array[T]):Int = {
  12. arr.length
  13. }
  14. }

泛型类

  1. package tcode.chapter11
  2. object $02_GenericClass {
  3. class Person[T,U](val name:T,val age:U){
  4. def getName():T = this.name
  5. def getAge():U = this.age
  6. }
  7. /**
  8. * 泛型类: class 类名[T,U,..](属性名:T,..){
  9. *
  10. * def 方法名(y:U):T = {...}
  11. * }
  12. * @param args
  13. */
  14. def main(args: Array[String]): Unit = {
  15. val person = new Person[String,Int]("lisi",2)
  16. println(person.getAge())
  17. }
  18. }

泛型逆变、协变

  1. package tcode.chapter11
  2. object $03_GenericChange {
  3. class B
  4. class C extends B
  5. //非变
  6. class Person1[T]
  7. //协变
  8. class Person2[+T]
  9. //逆变
  10. class Person3[-T]
  11. /**
  12. * 协变[+T]: 泛型之间是父子关系,通过泛型创建的对象之间继承了泛型的父子关系
  13. * 非变[T]: 泛型之间是父子关系,通过泛型创建的对象之间没有任何关系
  14. * 逆变[-T]: 泛型之间是父子关系,通过泛型创建的对象之间颠倒了泛型的父子关系
  15. *
  16. */
  17. def main(args: Array[String]): Unit = {
  18. var bs = List[B](new B,new B)
  19. var cs = List[C](new C,new C)
  20. bs = cs
  21. println(bs)
  22. //非变
  23. var bp = new Person1[B]
  24. var cp = new Person1[C]
  25. //
  26. //bp = cp
  27. //cp = bp
  28. //协变
  29. var bp2 = new Person2[B]
  30. var cp2 = new Person2[C]
  31. bp2 = cp2
  32. println(bp2)
  33. //逆变
  34. var bp3 = new Person3[B]
  35. var cp3 = new Person3[C]
  36. cp3 = bp3
  37. println(cp3)
  38. }
  39. }

泛型上下限

  1. package tcode.chapter11
  2. object $04_GenericLowUpper {
  3. class Parent
  4. class Sub1 extends Parent
  5. class Sub2 extends Sub1
  6. class Sub3 extends Sub2
  7. def m1[T<:Sub1](t:T): Unit ={
  8. println(t)
  9. }
  10. def m2[T>:Sub2](t:T): Unit ={
  11. println(t)
  12. }
  13. def m3[T>:Sub2<:Parent](t:T): Unit ={
  14. println(t)
  15. }
  16. /**
  17. * 上限: T <:类型 代表T必须是指定类型或者是其子类
  18. * 下限: T>:类型 代表T必须是指定类型或者是其父类
  19. * 如果需要同时写上下限,先写下限再写上限 T>:类型1<:类型2
  20. */
  21. def main(args: Array[String]): Unit = {
  22. m1(new Sub1)
  23. val s:Any = 1
  24. m2(s)
  25. m3(new Sub3)
  26. }
  27. }

泛型上下文限定

  1. package tcode.chapter11
  2. import scala.beans.BeanProperty
  3. object $05_GenericContext {
  4. class Person[T](@BeanProperty var name:T)
  5. def m1[T](x:T)(implicit p:Person[T]) = {
  6. p.setName(x)
  7. println(p.getName)
  8. }
  9. def m2[T:Person](x:T) = {
  10. val person = implicitly[Person[T]]
  11. person.setName(x)
  12. println(person.getName)
  13. }
  14. /**
  15. * 泛型上下文:
  16. * def 方法名[T:指定类型](..):返回值类型 = {..}
  17. * 等价于
  18. * def 方法名[T](..)(implicit 参数名: 指定类型[T]):返回值类型 = {..}
  19. *
  20. */
  21. def main(args: Array[String]): Unit = {
  22. implicit val p:Person[String] = new Person[String]("")
  23. m1[String]("lisi")
  24. m2[String]("zhangsan")
  25. }
  26. }