《快学scala》习题解答-第十七章-类型参数

《快学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方法,返回组件交换过位置的新对偶

1
2
3
class Pair[T,S](val t:T,val s:S){
def swap() = new Pair(s,t)
}

17.2
定义一个可变类Pair[T],带一个swap方法,交换对偶中组件的位置。

1
2
3
class Pair[T](val s:T,val t:T){
def swap() = new Pair(t,s)
}

17.3
给定类Pair[T, S] ,编写一个泛型方法swap,接受对偶作为参数并返回组件交换过位置的新对偶。

1
2
3
class Pair[T,S](val t:T, val s:S){
def swap[T,S](t:T,s:S) = new Pair(s,t)
}

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’。

1
2
3
4
def middle[T](iter:Iterable[T]):T={
val seq = iter.toArray
seq(seq.length/2)
}

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”)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Anyone resolve this, please contact me
package _1709 {
class Pair[+T](val t:T, val s:T) {
def replaceFirst[T](newFirst: T) {}
}
class NastyDoublePair[Double](t1:Double, s1:Double) extends Pair[Double](t1,s1) {
override def replaceFirst(newFirst: Double) ={
/**
* error: type mismatch;
found : Double(in class NastyDoublePair)
required: scala.Double
new NastyDoublePair(newFirst,math.sqrt(newFirst))
*/
new NastyDoublePair(newFirst,math.sqrt(newFirst))
}
}
object test extends App {
val p: Pair[Any] = new NastyDoublePair(1.0, 2.0)
p.replaceFirst("Hello")
}
}

17.10
给定可变类Pair[S,T],使用类型约束定义一个swap方法,当类型参数相同时可以被调用。

1
2
3
class Pair[S,T](val s:S, val t:T){
def swap(implicit env: S =:= T) = new Pair(t,s)
}

参考:
《快学Scala》:http://book.douban.com/subject/19971952/

(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)