scala的泛型本质上和java是一样的,只不过语法不一样。
它有以下几种用法:
T<:B,上界,表示T是B的子类
T>:B,下界,表示T是B的老爹
B<%A,viewBound,表示表要转化成A,但要有一个隐式转换函数
B:A,contextBound,需要一个隐式转换的值,啥意思 ?
[-A,+B]
-A,逆变,表示参数类型,如果A是B的子类,则C[B]是C[A]的子类,反转了
+B,表示是返回类型,如果A是B的子类,则则C[A]仍然是C[B]的子类
上界举例:选择女神
1、新建女神类
class MissRight(val name: String, val faceValue: Int) extends Comparable[MissRight] {//必须定义为val时,才被识别为类的属性
//这地方入参不能是T,T必须是在源中的
override def compareTo(o: MissRight): Int = {
this.faceValue - o.faceValue
}
}
2、新建UpperBoundDemo类,它有一个select女神的方法
class UpperBoundDemo[T <: Comparable[T]] {//构造方法要不要用,但是Comparable后面必须要加T
def select(m1:T,m2:T): T ={
if(m1.compareTo(m2)>0) m1 else m2
}
}
注意:Comparable[T]后面必须加一个T
3、新建main
object UpperBoundDemo {
def main(args: Array[String]) {
val u=new UpperBoundDemo[MissRight]
val m1=new MissRight("biaozi",120)
val m2=new MissRight("erdiao",999)
val res=u.select(m1,m2)
println(res.name)
}
}