《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
第十七章 类型参数
17.1
定义一个不可变类Pair[T,S], 带一个swap方法,返回组件交换过位置的新对偶
|
|
17.2
定义一个可变类Pair[T],带一个swap方法,交换对偶中组件的位置。
|
|
17.3
给定类Pair[T, S] ,编写一个泛型方法swap,接受对偶作为参数并返回组件交换过位置的新对偶。
|
|
17.4
在17.3节中,如果我们想把Pair[Person]的第一个组件替换成Student,为什么不需要给replaceFirst方法定一个下界?
因为Student是Person的子类,是可以转成T类型的,不必定义下界
17.5
为什么RichInt实现的是Comparable[Int]而不是Comparable[RichInt]?
T <% Comparable[T] ,是隐含参数转化的,T是Int的时候将自动调用RichInt中的Comparable[RichInt]
17.6
编写一个泛型方法middle,返回任何Iterable[T]的中间元素。举例来说,middle(“World”)应得到’r’。
|
|
17.7
查看Iterable[+A]特质。哪些方法使用了类型参数A?为什么在这些方法中类型参数位于协变点?
如min, max, last 等。这些方法都会返回A类型,所以位于协变点。
17.8
在17.10节中,replaceFirst方法带有一个类型界定。为什么你不能对可变的Pair[T]定义一个等效的方法?
def replaceFirstR >: T { first = newFirst } //错误
因为first是子类,newFirst是超类,超类不能被赋值给子类。
17.9
在一个不可变类Pair[+T]中限制方法参数看上去可能有些奇怪。不过,先假定你可以在Pair[+T]定义
def replaceFirst(newFirst: T)
问题在于,该方法可能会被重写(以某种不可靠的方式)。构造出这样的一个示例。定义一个Pair[Double]的类型NastyDoublePair,重写replaceFirst方法,用newFirst的平方根来做新对偶。然后对实际类型为NastyDoublePair的Pair[Any]调用replaceFirst(“Hello”)。
|
|
17.10
给定可变类Pair[S,T],使用类型约束定义一个swap方法,当类型参数相同时可以被调用。
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)