黑猴子的家:Scala 对象不能泛型

我们没法给对象添加类型参数。比如,可变列表。元素类型为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

猜你喜欢

转载自blog.csdn.net/weixin_33904756/article/details/91182531