Scala 泛型

泛型在Scala和Java中类似,用于类或者方法用于指定任意类型 或者一种类型的参数,参数在使用的时候才会被确定,泛型可以有效的增强程序的灵活性,使用泛型的目的是可以使得类或者方法具有更高的通用性,或者作为一种规范。

泛型可以用于类,也可以用于方法,比如:
类中的泛型:

class CommonData[T]{
    private var  data: T = _

    def  get():T = data

    def  set(value:T) = data = value
}

这个简单的泛型,可以指定任意类型,比如说Int,String等

方法中的泛型,比如定一个数组:

 // ClassTag 表示的是运行状态的信息,这里表示的是运行的时候的类型
  def makeArray[T:ClassTag](element: T*) = Array[T](element:_*)
  
  def main(args: Array[String]): Unit = {
    val demo = new ListDemo().makeArray[String]("1", "3")
    demo.foreach(s=>println(s))
    }

调用的时候指定类型即可。 其中的T* 表示的可变参数

泛型的规则:

  1. 泛型的上边界和下边界
    上边界: 表示泛型的类型必须是 某种类型的子类,表示为 <:
    下边界: 表示泛型的类型必须是 某种类型的父类,表示为 >:
    比如:
class Test1[T <: Comparable[T]]{
}
  1. 协变和逆变
    协变: 在类型参数的前面加上一个 +
    逆变: 在类型参数前面加上一个 -

这里可以类比一下,我们在Java中我们可以
Object str = new String();一个子类可以赋值给一个父类,这样的编译器是允许的。
但是你不可以这样:ArrayList list = new ArrayList();
这样在Java中编译不会通过的,但是在Scale中就可以
比如:
val list:List[AnyRef] = ListString 原因就是协变。

再比如:

class Person1{}
class Student1 extends Person1{
   def sayOut: Unit ={
    println("Student")
  }
}
class CommonData[+T](t:T){}

val data = new CommonData[Student1](new Student1())
    val data1:CommonData[Person1] = data

这意味着支持泛型T的子类可以向支持T的类赋值,这个是协变。
逆变正好相反,如下:

class Person1{}
class Student1 extends Person1{}
class CommonData[-T](t:T){}


val data = new CommonData[Person1](new Person1())
val data1:CommonData[Student1] = data

欢迎关注我的公众号: manong_xiaodong。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟红尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值