黑猴子的家:Scala 视图界定

1、概述

在上一小节,我们看多一个带上界的示例

class Pair[T <: Comparable[T]]

可惜如果我们试着new 一个 Pair(4,2),编译器会抱怨说Int不是Comparable[Int]的子类型。和Java.lang.Integer包装类型不同,Scala的Int类型并没有实现Comparable。不过,RichInt实现了Comparable[Int],同时还有一个从Int到RichInt的隐士转换,隐士转换我们后边会讲解

解决方法是使用“视图界定(view bound)”,就像这样:

class Pair[T <% Comparable[T]]

<% 关系意味着T 可以被隐士转换成Comparable[T]
不过,Scala的视图界定即将推出历史舞台,如果你再编译时打开-future选项,使用视图界定将受到编译器的警告。你可以用“类型约束(type constraint)”替换视图界定,就像这样

class Pair[T](val first:T,val second:T)(implicit ev:T=> Comparable[T]){
   def smaller = if (first.comparaTo(second) <0 ) first else second
}

2、实操

在Scala中,如果你想标记某一个泛型可以隐式的转换为另一个泛型,可以使用:[T <% Comparable[T]],由于Scala的Int类型没有实现Comparable接口,所以我们需要将Int类型隐式的转换为RichInt类型

class Pair5[T <% Comparable[T]](val first: T, val second: T) {
  def smaller = if (first.compareTo(second) < 0) first else second
  override def toString = "(" + first + "," + second + ")"
}

object Main5 extends App {
  val p = new Pair5(4, 2)
  println(p.smaller)
}

你可能感兴趣的:(黑猴子的家:Scala 视图界定)