上界,下界,视图绑定和上下文边界

首页scala上界,下界,视图绑定和上下文边界(2018年11月28日)

class Earth {

  def sound(){
    println("hello !")
  }
}
class Animal extends Earth{
  override def sound() ={
    println("animal sound")
  }
}
class Bird extends Animal{
  override def sound()={
    println("bird sounds")
  }
}
// 上界
println("<:上界测试")
def biophony[T <: Animal](things: Seq[T]) = things map(_.sound)
biophony(List(new Bird(),new Animal()))
biophony(Seq(new Animal, new Animal))

// 下界
println(">:下界测试")
//因为比这个类大的还有类Object 所以不确定是否有sound函数 所以编译通不过 .map(_.sound)
def biophony1[T >: Animal](things: Seq[T]) = things
//为什么传Bird()也不报错呢 因为返回的是Animal实例 自动as Animal了
//如果参数再传一个 new Moon()  那么返回的是 Object实例 因为不是我们定义的Animal
biophony1(List(new Earth(),new Animal(),new Bird())).map(_.sound())

println("<%视图绑定测试 ")
// 符号意思 T必须可以转化为Animal
def biophony2[T <% Animal](things: T) = {
  things.sound()
}
// 因为Earth是Animal的父类 所以我们传Earth是不可能转化为Animal的
// 如果不加隐式转换 则无法通过编译
implicit def autoChange(things:Earth) = new Animal
biophony2(new Earth)
// Bird本身是Animal的子类 所以直接可以通过
biophony2(new Bird)

// 上下文边界
println(":上下文边界测试 ")
// 意思是必须存在一个“T[Seq]”的隐式值
def biophony3[T:Seq](things: T) = {
  println(things)
}
// 这个隐式转换没有看懂
implicit val b = Seq(new Animal)
biophony3(new Animal)

标签: none

评论已关闭