Scala:在继承树的底部放置类型

时间:2014-06-05 17:20:23

标签: scala inheritance bottom-type

Scala定义了一个名为Nothing的类型,它是所有类型的子类型。是否可以定义我们自己的“底部类型”,它应该位于从给定超类型扩展的继承树的底部?

例如,假设我有一些类型Foo,我想说Xyzzy应该位于Foo的继承树的底部 - 换句话说,它应该继承从任何继承自Foo的东西。如果我们引入新类型BarBar <: Foo,那么Xyzzy <: Bar。我基本上都在寻找一种说class Xyzzy isBottom Foo { ... }的方法。有没有办法直接实现这一目标,或间接实现这一效果?

3 个答案:

答案 0 :(得分:1)

有可能接近你想要做的想法。对于继承链中的所有类型,这不是一般的“底部”类型。相反,它是特定于使用泛型的特征的底部类型。您需要在继承结构中的类型定义中重用Nothing。请查看List[_],了解他们如何定义Nil

case class ::[A](value: A, next: List[A]) extends List[A]
case object Nil extends List[Nothing]

因此,Nil是所有List[A]的{​​{1}},因为列表的类型参数定义为A

答案 1 :(得分:0)

这不起作用:

class Foo
abstract final class Xyzzy extends Foo
class Bar extends Foo

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> typeOf[Xyzzy] <:< typeOf[Foo]
res0: Boolean = true

scala> typeOf[Xyzzy] <:< typeOf[Bar]
res1: Boolean = false

Nothing似乎是由编译器专门处理的。

答案 2 :(得分:0)

我的意思是你可以做到这一点

trait Foo
abstract final class Xyzzy extends Foo
implicit def XyzzyIsBottom[A <: Foo]: Xyzzy <:< A = null

// Example usage
class X extends Foo
def xyzzyToX(x: Xyzzy): X = x