Scala中的类型参数晦涩难懂,不过有几个基本要点可以记录
T <:UpperBound 上界,通俗理解T是UpperBound的子类
T >: LowerBound 下界,通俗理解为T为LowerBound的超类
T <% Comparable[T] 视图界定,简单理解为,T可以通过隐式转换为后者
T : Ordering 上下文界定,必须存在一个类型为Ordering[T]的隐式值,这里还没有过多使用,不明其使用场景
型变
+T 协变,Student extends Person ,那么接收Pair[Person]的地方并不能接收Pair[Student],这里就需要将Pair定义为协变的,才能接收
-T 逆变 这东西目前还不懂
Scala可以允许程序员自己定义隐式转换,比如:
Implicit def int2Fraction(n : Int) =Fraction(n,1)
定义了上面的转换之后,当程序遇到下面的代码:
valresult = 3* Fraction(4,5)
正常情况下上面代码是不能通过编译的,因为整数3是不能与一个对象相乘的,这里因为有上面的隐式转换的定义在,所以3会被转换为函数调用int2Fraction(3)。
隐式转换在scala中使用比较多,编译器转换规则如下:
1、如果不进行任何隐式转换就可以编译通过的情况下,编译器不会做任何转换,如果确实需要需要自己显示转换
2、如果可以同时执行多个转换的情况下,即有二义性,编译器会报错拒绝转换
3、编译器不会进行深层栈转换(需要通过多次转换)