Scala in Impatient 习题解答17 类型参数L2
16 June 2014
-
定义一个不可变类
Pair[T, S]
,带一个swap方法,返回组件交换过位置的新对偶。class Pair[T, S](val first: T, val second: S) { def swap() = new Pair(second, first) }
-
定义一个可变类
Pair[T]
,带一个swap方法,交换对偶中组件的位置。class Pair[T](var first:T, var second: T) { def swap() = new Pair(second, first) }
-
给定类
Pair[T, S]
,编写一个泛型方法swap,接受对偶作为参数并返回组件交换过位置的新对偶。class Pair[T, S](val first: T, val second: S) { def swap(p: Pair[T, S]) = new Pair(p.second, p.first) }
- 因为Student是Person的子类,是可以转成T类型的,不必定义下界
-
T <% Comparable[T]
,T是Int的时候将自动调用RichInt中的Comparable[Int]
,所以是实现Comparable[Int]
而不是Comparable[RichInt]
-
def middle[T](it: Iterable[T]) = { it.toSeq match { case seq => seq((seq.size / 2).toInt) } }
-
很多方法都使用了A, 比如min, max, last 等等。这些方法都会产出A类型,所以位于协变点
-
class Pair[+T](var first: T, var second: T) { def replaceFirst[R >: T](newFirst: R) {first = newFirst} }
报以下错误
<console>:8: error: type mismatch;
found : newFirst.type (with underlying type R)
required: T
def replaceFirst[R >: T](newFirst: R) {first = newFirst}
^ 只是因为R是父类,不能赋给子类。
-
class Pair[+T](val first: T, val second: T) { def replaceFirst(newFirst: T){} //编译不过 } class NastyDoublePair(a: Double, b: Double) extends Pair[Double](a, b){ override def replaceFirst(newFirst: Double) = { new Pair(math.sqrt(newFirst), b) } } object a extends App { val p: Pair[Any] = new NastyDoublePair(1.0, 2.0) p.replaceFirst("Hello") }
虽然假定以上代码可以编译通过,但是,如果方法被重写导致允许传入不恰当的类型。
-
class Pair[S, T](var first:S, var second: T) { def swap(implicit ev: S =:= T) = new Pair(second, first) }
scala> val a = new Pair(1,2) a: Pair[Int,Int] = Pair@9981eb scala> a.swap res33: Pair[Int,Int] = Pair@1f650e6 scala> res33.first res34: Int = 2 scala> val b = new Pair(1,"2") b: Pair[Int,String] = Pair@d3e2d4 scala> b.swap <console>:10: error: Cannot prove that Int =:= String. b.swap ^
可以看到,如果类型不同,调用了类型约束
了的函数会报以上错误。
use Scala 2.11.1
blog comments powered by Disqus