我们没法给对象添加类型参数。比如,可变列表。元素类型为T的列表要么是空的,要么是一个头部类型为T、尾部类型为List[T]的节点
abstract class List[+T]{
def isEmpty:Boolean
def head:T
def tail:List[T]
}
class Node[T](val head:T,val tail:List[T]) extends List[T]{
def isEmpty = false
}
class Empty[T] extends List[T]{
def isEmpty = true
def head = throw new UnsupportedOperationException
def tail = throw new UnsupportedOperationException
}
尖叫提示:这里我用Node和Empty是为了让讨论对Java程序员而言比较容易。如果你对Scala列表很熟悉的话,之哟啊在脑海中将其替换成::和Nil即可
将Empty 定义成类看上去有些傻,因为它没有状态。但是,你又无法简单地将它变成对象:
object Empty[T] extends List[T] //错误
你不能将参数化的类型添加到对象。 在本例中,我们额解决方法是继承List[Nothing]:
object Empty extends List[Nothing]
你应该还记得,Nothing类型是所有类型的子类型。因此,当我们构造如下单元素列表时,
val list1 = new Node(42,Empty)
类型检查是成功的。根据协变的规则,List[Nothing] 可以被转成成List[Int],因而Node[Int]的构造器能被调用
转载于:https://www.jianshu.com/p/49566fee14bb