今天看学习scala上下界,发现在理解下界 [>:] 这个有一点点问题,记录一下。
- 先解释上下界,scala处处是泛型,函数基本也是泛型表示 ,类或者函数后面接一个中括号[T]来标识泛型类别T,类似C++泛型。
- [R>:T]表示类型R至少比T类型要大,也就是说R至少是T的超类。
- [R<:T]表示类型R至多为T,即R为T的子类/或者就是T类型。
object LowerBound extends App {
val first = new Ebook("hello")
val second = new Pbook("paper book")
val p1: Pair1[Book] = new Pair1(first, second)
println(p1)
//scala> val p1 = new Pair1(first,second)
//p1: Pair1[Book] = name--hello---name--paper book
//Ebook,Pbook,最终得到的类是Pair1[Book]
val newFirst = new Book("generic pBook")
val p2 = p1.replaceFirst(newFirst)
//p2: Pair1[Book] = name--generic pBook---name--paper book
println(p2)
/* 下面可以编译通过,p1:Pair1[Book], p1.replaceFirst(),可知T为Book,R>:T,由此可知R至少为Book类型,
而传入参数为WeirdBook,所以共同基类就是Book,推测R为Book类型,replaceFirst[Book>:Book](weirdFirst:Book)
scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
scala> val newList = "Hello" :: list
newList: List[Any] = List(Hello, 1, 2, 3)*/
val weirdFirst: WeirdBook = new WeirdBook("Weird pBook")
val p3 = p1.replaceFirst(weirdFirst)
println(p3)
val p4: Pair1[Pbook] = new Pair1(second,second)
val p6: Pair1[Pbook] =p4.replaceFirst(weirdFirst)
}
例子注释:为何val p3=p1.replaceFirst(weirdFirst)可以运行。类型变量界定建立在类继承层次结构的基础上,但有时候这种限定不能满足实际要求,如果希望跨越类继承层次结构时,可以使用视图界定来实现的,其后面的原理是通过隐式转换来实现,视图界定利用<%符号来实现。视图界定和上下界类似,不仅可以跨越类继承层次结构,还可以利用隐式转换来达到界定。
博客来源:http://blog.youkuaiyun.com/lovehuangjiaju/article/details/47264365
点此进入