范型和implicit

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
      }
    }
  }

}


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)
  }
}


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)
  }
}

你可能感兴趣的:(范型和implicit)