开发者学堂课程【Scala 核心编程 - 进阶:Scala 上界介绍和应用实例2】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9153
Scala 上界介绍和应用实例2
scala 中上界课程测试题(理解上界含义)
obiect LowerBoundsDemo
{
def mainargs:Array[String]):Unit=
{
biophony(Seq(new Bird, new Bird)) //?
biophony(Seq(new Animal, newAnimal)) //? biaphony(Sea(new Animal, new Bird))//?
biophony(Sea(new Earth, new Earth)) //?
}
来看案例:
这里传入了一个 sequence 序列,里面传了两只鸟。传进去这个 things,进行map。这边应该输出两声鸟叫 bird sounds,因为鸟的确是 animal的子类。
又传了一个sequence,是传了两 animal,两个IP就传进去了。
泛型威力还是很大的,它可以通用,还可以传不同的东西。传一个animal,再传一个 bird,如果没有这上街界的概念,其实很难做到这一点。它会发出一个animal的叫声,一个 bird 的声音。
这个能传进去吗?earth 是 animal 的父类。父类会是 animal 的子类吗?显然,这个是不行的。
def biophony[T<:Animal](things: Seq[T]) = things map (_.sound//这是一个函数,这个函数用了一个上界。传入的T的这个类型,需要是animal的子类,也可以是animal,类似于小于等于。然后接收sequence, equence是个序列,而里面的泛型是T,就是前面的T。这个things拿到以后调用map。
Map以前需要加点,这个地方不加也是可以的。这个下划线表示从since这个集合里取出来的一个一个的对象。
class Earth(//Earth 类
def sound(){//方法
printin("hello !")
}}
class Animal extends Earth
override def soundo=!//重写了Earth的方法sound()
println("animal sound")
}}
class Bird extends Animal{
override def sound()={ //将Animal的方法重写
print("bird sounds")
}
}
下面运行一下代码:
obiect LowerBoundsDemo
{
def mainargs:Array[String]):Unit=
{
biophony(Seq(new Bird, new Bird)) //
√
biophony(Seq(new Animal, newAnimal)) //
√
biaphony(Sea(new Animal, new Bird))//
√
//
biophony(Sea(new Earth, new Earth)) //
×
先把最后一个去掉点击运行。
是成功的:
把最后一条加上看看情况如何:
两个地球去运行。这个时候上届就发挥作用了。
第八行,这一行说的是不能转成这个参数,就是它跟这个匹配不上。
报错原因:
earth 不是 animal 的子类
关于上界的案例就介绍到这里。