黑猴子的家:Scala 类型变量限定

1、上界

在Java泛型里,不表示某个泛型是另外一个泛型的子类型,可以使用extends关键字,
class Dog<T extends Animal> 上界,当然传Animal也是可以的
而在scala中使用符号“<:”,这种形式称之为泛型的上界

class Pair3[T <: Comparable[T]](val first: T, val second: T) {
  def smaller = if (first.compareTo(second) < 0) first else second
}

object Main3 extends App{
  override def main(args: Array[String]): Unit = {
    val p = new Pair3("Fred", "Brooks")
    println(p.smaller)
  }
}
2、下界

在Java泛型里表示某个泛型是另外一个泛型的父类型,使用super关键字,而在scala中,使用符号“>:”,这种形式称之为泛型的下界。

class Pair4[T](val first: T, val second: T) {
  def replaceFirst[R >: T](newFirst: R) = new Pair4[R](newFirst, second)
  override def toString = "(" + first + "," + second + ")"
}

object Main4 extends App{
  override def main(args: Array[String]): Unit = {
    val p = new Pair4("Nick", "Alice")
    println(p)
    println(p.replaceFirst("Joke"))
    println(p)
  }
}

在Java中,T同时是A和B的子类型,称之为多界,形式如 <T extends A & B>
在Scala中,对上界和下界不能有多个,但是可以使用混合类型,如 [T <: A with B]
在Java中,不支持下界的多界形式。如 <T super A &B>这是不支持的。
在Scala中,对复合类型依然可以使用下界,如 [T >: A with B]

如果 def replaceFirst[R >: T] 不写上界,例如def replaceFirst[R ] 编译的时候是可以通过的,但是将返回Pair[Any]

Java
class Dog<T extends Animal> 上界 √
class Dog<T super SmallDog> 下界 √
class Dog<T super A & B> ×

Scala
class Dog[T <: Animal] √
class Dog[T >: Animal] √

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值