Scala使用隐式转换进行比较

 Boy.scala

class Boy(val name: String, val faceValue: Int) extends Comparable[Boy]{
  override def compareTo(o: Boy): Int = {
    this.faceValue - o.faceValue
  }
}

 Girl.scala

class Girl(val name: String, val faceValue: Int, val size: Int) {

}

  MissLeft.scala

复制代码
//class MissLeft[T <% Ordered[T]] {
//
//  def choose(first: T, second: T) : T = {
//    if (first > second) first else second
//  }
//
//}

class MissLeft[T : Ordering] {

  def choose(first: T, second: T): T = {
    val ord = implicitly[Ordering[T]]
    if(ord.gt(first, second)) first else second
  }
}

object MissLeft {
  def main(args: Array[String]) {
    import MyPreDef.girlOrdering
    val ml = new MissLeft[Girl]
    val g1 = new Girl("hatanao", 98, 28)
    val g2 = new Girl("sora", 95, 33)
    val g = ml.choose(g1, g2)
    println(g.name)
  }
}
复制代码

 

 MissRight.scala

复制代码
class MissRight[T] {

  def choose(first: T, second: T)(implicit ord : T => Ordered[T]): T = {
    if(first > second) first else second
  }

  def select(first: T, second: T)(implicit ord : Ordering[T]): T ={
    if(ord.gt(first, second)) first else second
  }

  def random(first: T, second: T)(implicit ord : Ordering[T]): T ={
    import Ordered.orderingToOrdered
    if(first > second) first else second
  }

}

object MissRight {
  def main(args: Array[String]) {
    val mr = new MissRight[Girl]
    val g1 = new Girl("hatanao", 98, 28)
    val g2 = new Girl("sora", 95, 33)

    import MyPreDef.girlOrdering
    //val g = mr.choose(g1, g2)
    val g = mr.select(g1, g2)
    println(g.name)
  }
}
复制代码

  MyPreDef.scala

复制代码
object MyPreDef {

  implicit def girlToOrdered(girl: Girl) = new Ordered[Girl]{
    override def compare(that: Girl): Int = {
      if(girl.faceValue == that.faceValue) {
        girl.size - that.size
      } else {
        girl.faceValue - that.faceValue
      }
    }
  }

  implicit object girlOrdering extends Ordering[Girl] {
    override def compare(x: Girl, y: Girl): Int = {
      if(x.faceValue == y.faceValue) {
        x.size - y.size
      } else {
        x.faceValue - y.faceValue
      }
    }
  }
}
复制代码

 

 MrRight.scala

复制代码
class MrRight[T] {

  def choose[T <: Comparable[T]](first: T, second: T): T = {
    if(first.compareTo(second) > 0) first else second
  }

}

object MrRight {
  def main(args: Array[String]) {
    val mr = new MrRight[Boy]
    val b1 = new Boy("zhangsan", 99)
    val b2 = new Boy("lisi", 100)
    val b = mr.choose(b1, b2)
    println(b.name)
  }
}
复制代码

 



本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6736954.html,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值