泛型介绍
- 泛型类、泛型函数
- 泛型用于指定方法或类可以接受任意类型参数
- 参数在实际使用时才被确定
- 泛型可以有效地增强程序的适用性
- 使用泛型可以使得类或方法具有更强的通用性
七种形式
- [A<:] :上边界:表达了泛型的类型必须是"某种类型"或某种类型的"子类"
案例:override def toSet[B >: A]: Set[B] = {} - [A>:] :下边界:表达了泛型的类型必须是"某种类型"或某种类型的"父类"
案例:override def toSet[B >: A]: Set[B] = {} - [A<%] : view bounds可以进行某种神秘的转换,把你的类型在没有知觉的情况下转换成目标类型
可以认为view bounds是上下边界的加强和补充,语法为:"<%",要用到implicit进行隐式转换 - “T:classTag”:相当于动态类型,你使用时传入什么类型就是什么类型
- 逆变和协变:-T和+T: +T可以传入其子类和本身(与继承关系一至)-T可以传入其父类和本身(与继承的关系相反)
案例:trait scala.collection.immutable.Map[K, +V] extends Iterable[(K, V)] - “T:Ordering” :表示将T变成Ordering[T],可以直接用其方法进行比大小,可完成排序等工作
- [A]: 一般形式:
案例:trait scala.collection.immutable.Set[A] extends Iterable[A]
代码说明:
//泛型类
class Student[A]{
//泛型属性+泛型方法(get和set)
var a:A = _
def getName():A ={
a
}
def m[T]():Unit={
println("hehe")
}
}
object GenericDemo01 {
def main(args: Array[String]): Unit = {
val stu = new Student[String]
stu.a = "aaaa"
println(stu.getName())
}
}