scala的小于和冒号在一起是啥意思
发布网友
发布时间:2022-05-12 06:58
我来回答
共1个回答
热心网友
时间:2024-02-19 04:58
“>:”符号
我们把“<:”换成了“>:”
def biophony[T >: Animal](things: Seq[T]) = things map (_.sound())
不对这怎么还报红了呢?细细想来,Animal的父类的话,不能确定能不能有sound()方法呀,因为父类太多了,Object还是呢。报错也正常,我们就直接返回 things吧
def biophony[T >: Animal](things: Seq[T]) = things
好了,这下好了,不报红了,我们传一个Animal的父类“Earth”的队列,然后没个元素调用“sound()”方法
biophony(Seq(new Earth, new Earth)).map(_.sound())
输出:
hello !
hello !
之前的结论,调用Animal也应该是可以的:
biophony(Seq(new Animal, new Animal)).map(_.sound())
输出:
animal sound
animal sound
好的,也是正确的。假如我们传Animal子类Bird看看会不会报错
biophony(Seq(new Bird, new Bird)).map(_.sound())
输出:
bird sounds
bird sounds
居然不报错!还运行了!这是怎么回事??
我们看一下传Bird后的返回值是什么:
是Animal !*大白了,由于Bird是子类,Scala把Bird当做Animal来处理了。也就是说,“>:”的时候,传任何参数都可以,但是返回值回有所不同,Animal的子类都会统一按照Animal来处理!
那我们传一个和Animal毫不相关的类,会出现什么情况呢?
class Moon {
}
写了一个Moon,然后按照如下文传参调用
biophony(Seq(new Moon, new Moon))
不报错!
我们看一下返回值:
Object!Scala把它看做了Object。也就是说,可以随便传!只不过和Animal直系的,是Animal父类的还是父类处理,是Animal子类的按照Animal处理,和Animal无关的,一律按照Object处理!