美丽的神话 发表于 2023-6-22 04:10:40

Scala泛型

泛型的定义

object _11_泛型 {
def main(args: Array): Unit = {
    //这个代表的就是泛型==》 在创建对象的时候,可以指定需要传进去的类型
    //作用就是在创建对象的时候,可以对传进去的参数一个约束,当设置泛型位int之后,那么传进去的值就必须是int
    //apply(xs: A*): List = xs.toList
    val ints: List = List(1, 2, 3, 4)

    //自己写一个?单纯演示泛型语法的定义,没有什么实际的意义
    /**
   * 将泛型定义在类上,那么在整个类中,都可以使用该泛型,作用域是整个类
   * @tparam T
   */
    class TestFanXin(){
      def max(a:T,b:T)= a
    }
    //如果设置泛型位Int类型,那么方法的参数就只能传Int类型
    new TestFanXin().max(1,2)
    //如果设置泛型位String类型,那么方法的参数就只能传String类型
    new TestFanXin().max("aa","bb")

    /**
   * 泛型也可以定义在方法上,如果定义在方法上,那么该泛型的作用域只能作用在该方法中
   * 出了该方法便不能生效
   */
    class TestFanXin1(){
      def max(a:T,b:T)= a
      def min(a:A,b:A)= b
    }
}
}泛型上下限

泛型的上下限的作用是对传入的泛型进行限定。
语法:
//泛型上限只能够传Person 这个类和他的的子类
Class PersonList{
}
//泛型下限 只能够传Person 这个类和他的的父类
Class PersonList{
}代码示例:
package com.doit.day02


object _12_泛型的上下限 {
def main(args: Array): Unit = {

    def sayHi(a:A): Unit ={
      println("test")
    }

    def sayHello(a:A): Unit ={
      println("test")
    }

    //调用sayHi的时候,传进去的参数因为有泛型的上界约定,所以只能传入Father和Father的子类
    sayHi(new Son())
    sayHi(new Father())
    //这边编译的时候虽然不报错,但是运行的时候会报错
//    sayHi(new GrandFather())

    //如果泛型是定义在方法上的,如果没有加泛型,是限制不住的,但是加了泛型,还是可以限制住的
//    sayHello(new ABC)
//    sayHello(new Son)
    sayHello(new Father)
    sayHello(new GrandFather)


    class Test{
      def sayHi(a:A) ={
      println("hello")
      }
    }

    new Test.sayHi(new Father)
    //如果定义在类上的话,就能约束住了
//    new Test.sayHi(new Son)
    new Test.sayHi(new GrandFather)




}
}

class Son extends Father

class Father extends GrandFather

class GrandFather

class ABC视图限定


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

语法:
不变:默认
协变: +T
逆变: -T
package com.doit.day02

object _13_视图限定 {
def main(args: Array): Unit = {

    class Bird(val name:String){
      def fly()={println(name + "飞走了")}
    }

    class ToyBird

    def bitBird(b:T)=b.fly()

    bitBird(new Bird("小鸟"))

    implicit def toy2Bird(toyBird: ToyBird)= new Bird("玩具鸟")

    bitBird(new ToyBird)
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Scala泛型