23泛型

本文最后更新于 2021-08-05 11:42:59

泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//泛型类
case class Point[T](val x:T,val y:T){
def fun():T=x
}


object Demo1 {
def main(args: Array[String]): Unit = {
val p =Point[Int](1,2)
val x: Int = p.x
val i: Int = p.fun()

val j: Int = fun2[Int](1)
//可以推导
val k: Int = fun2(1)
}

//泛型方法
def fun2[T](x:T)=x
}

指定上下界,视图绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
object Demo2 {
def main(args: Array[String]): Unit = {
println(compare[BigInt](1,2))

}

//泛型指定上界
//传入类型是Ordered的子类
def compare[T <: Ordered[T]](x:T,y:T)={
if (x < y) x
else y
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
abstract class Animal{
val name:String
}

abstract class Pet extends Animal{

}

class Dog extends Pet{
override val name:String = "dog"
}
class Cat extends Pet{
override val name:String = "cat"
}

object demo3 {
def main(args: Array[String]): Unit = {
showName(new Dog)
showName(new Dog)
getPet()



println(max[Int](1, 2))

}

//泛型指定上界
//传入类型是Ordered的子类
def showName[T <:Pet](x:T)={
println(x.name)
}

//指定下界
//一般指定返回值
def getPet[T >:Pet]():Pet={
new Dog
}

//视图绑定
//比如这里Int没有继承Ordered,但是存在隐式转换RichInt继承Ordered
//所以把Int转换成RichInt
def max[T <% Ordered[T]](x:T,y:T): Unit ={
if (x < y) x
else y
}
}

不变,协变,逆变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MyList[T]

class Father

class Son extends Father

object Demo5 {
def main(args: Array[String]): Unit = {
val a: Father = new Son

var fList: MyList[Father] = new MyList[Father]
var sList: MyList[Son] = new MyList[Son]

//不变 默认
//不行,子类型的泛型对象,不能赋值给父类型的泛型对象
//fList =sList

//协变
//但是如果泛型对象是 MyList[+T] 就可以了
//fList=sList
//适用于参数位置

//逆变
//但是如果泛型对象是 MyList[-T] 就可以了
//赋值给子类型用
//sList=fList
//适用于返回值位置
}


}

23泛型
https://jiajun.xyz/2020/11/18/scala/23泛型/
作者
Lambda
发布于
2020年11月18日
更新于
2021年8月5日
许可协议