Scala泛型

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

泛型的定义
  1. object _11_泛型 {
  2.   def main(args: Array[String]): Unit = {
  3.     //[A]  这个代表的就是泛型  ==》 在创建对象的时候,可以指定需要传进去的类型
  4.     //作用就是在创建对象的时候,可以对传进去的参数一个约束,当设置泛型位int之后,那么传进去的值就必须是int
  5.     //apply[A](xs: A*): List[A] = xs.toList
  6.     val ints: List[Int] = List[Int](1, 2, 3, 4)
  7.     //自己写一个?  单纯演示泛型语法的定义,没有什么实际的意义
  8.     /**
  9.      * 将泛型定义在类上,那么在整个类中,都可以使用该泛型,作用域是整个类
  10.      * @tparam T
  11.      */
  12.     class TestFanXin[T](){
  13.       def max(a:T,b:T)= a
  14.     }
  15.     //如果设置泛型位Int类型,那么方法的参数就只能传Int类型
  16.     new TestFanXin[Int]().max(1,2)
  17.     //如果设置泛型位String类型,那么方法的参数就只能传String类型
  18.     new TestFanXin[String]().max("aa","bb")
  19.     /**
  20.      * 泛型也可以定义在方法上,如果定义在方法上,那么该泛型的作用域只能作用在该方法中
  21.      * 出了该方法便不能生效
  22.      */
  23.     class TestFanXin1(){
  24.       def max[T](a:T,b:T)= a
  25.       def min[A](a:A,b:A)= b
  26.     }
  27.   }
  28. }
复制代码
泛型上下限

泛型的上下限的作用是对传入的泛型进行限定。
语法:
  1. //泛型上限  只能够传Person 这个类和他的的子类
  2. Class PersonList[T <: Person]{
  3. }
  4. //泛型下限 只能够传Person 这个类和他的的父类
  5. Class PersonList[T >: Person]{
  6. }
复制代码
代码示例:
  1. package com.doit.day02
  2. object _12_泛型的上下限 {
  3.   def main(args: Array[String]): Unit = {
  4.     def sayHi[A <: Father](a:A): Unit ={
  5.       println("test")
  6.     }
  7.     def sayHello[A >: Father](a:A): Unit ={
  8.       println("test")
  9.     }
  10.     //调用sayHi的时候,传进去的参数因为有泛型的上界约定,所以只能传入Father和Father的子类
  11.     sayHi(new Son())
  12.     sayHi(new Father())
  13.     //这边编译的时候虽然不报错,但是运行的时候会报错
  14. //    sayHi(new GrandFather())
  15.     //如果泛型是定义在方法上的,如果没有加泛型,是限制不住的,但是加了泛型,还是可以限制住的
  16. //    sayHello[ABC](new ABC)
  17. //    sayHello[Son](new Son)
  18.     sayHello(new Father)
  19.     sayHello(new GrandFather)
  20.     class Test[A >:Father]{
  21.       def sayHi(a:A) ={
  22.         println("hello")
  23.       }
  24.     }
  25.     new Test[Father].sayHi(new Father)
  26.     //如果定义在类上的话,就能约束住了
  27. //    new Test[Son].sayHi(new Son)
  28.     new Test[GrandFather].sayHi(new GrandFather)
  29.   }
  30. }
  31. class Son extends Father
  32. class Father extends GrandFather
  33. class GrandFather
  34. class ABC
复制代码
视图限定


约束本质:存在一个隐式转换,能够将T类型转换成B类型
泛型视图限定:T  0) cat else cat1    }    //不过回头想比较狗狗,又要写一个,比较麻烦,不通用    //这时候就可以定义泛型了    def bigger2[T](t: T,t1:T,cmp:Ordering[T]):T={      if (cmp.compare(t,t1)> 0) t else t1    }    //方法的调用  这样是没什么问题的    //但是在马大爷眼里,这么写代码,多low啊,不符合马大爷的气质,他就开始搞事情了    bigger2[Cat](Cat(10,100),Cat(20,80),new Ordering[Cat] {      override def compare(x: Cat, y: Cat) = x.age - y.age    })    //咱们不是有隐式转换嘛,能不能把这个比较器呢?    //我上下文中找找,有没有什么隐式的比较器可以拿过来用,如果有我就直接拿过来,这样就不用传比较器了,去偷一个不香嘛    //bigger3[T :Ordering]  注意:如果想让他自己偷一个,那么需要实现上下文界定,不然是没办法使用的    def bigger3[T :Ordering](t: T,t1:T):T={      if(implicitly[Ordering[T]].compare(t,t1)>0) t else t1    }    /**     * 两种创建隐式比较器对象的写法     */    //    implicit val value: Ordering[Cat] = new Ordering[Cat] {//      override def compare(x: Cat, y: Cat) = x.age - y.age//    }    implicit val value1 = Ordering.by[Cat,Int](cat=>cat.age)    bigger3[Cat](Cat(10,100),Cat(20,80))  }}[/code]逆变,协变,不变

语法:
不变:默认
协变: +T
逆变: -T
  1. package com.doit.day02
  2. object _13_视图限定 {
  3.   def main(args: Array[String]): Unit = {
  4.     class Bird(val name:String){
  5.       def fly()={println(name + "飞走了")}
  6.     }
  7.     class ToyBird
  8.     def bitBird[T <% Bird](b:T)=b.fly()
  9.     bitBird[Bird](new Bird("小鸟"))
  10.     implicit def toy2Bird(toyBird: ToyBird)= new Bird("玩具鸟")
  11.     bitBird[ToyBird](new ToyBird)
  12.   }
  13. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表