黑猴子的家: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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值