Scala定义了一个名为Nothing的类型,它是所有类型的子类型。是否有可能定义我们自己的“底层类型”,这些类型应该位于继承树的底部,继承树从给定的超级类型扩展而来?
例如,假设我有某种类型的Foo,我想说Xyzzy应该位于Foo的继承树的底部--换句话说,它应该继承从Foo继承的任何东西。如果我们引入一个新的类型Bar和Bar <: Foo,那么Xyzzy <: Bar。我基本上是在寻找一种表达class Xyzzy isBottom Foo { ... }的方法。有什么方法可以直接或间接地实现这种效果呢?
发布于 2014-06-05 20:37:16
这是有可能接近你想要做的想法。这不是继承链中所有类型的一般“底部”类型。相反,它是一种特定于使用泛型的特性的底部类型。您需要在继承结构中的类型定义中重用Nothing。看看List[_],看看他们是如何定义Nil的
case class ::[A](value: A, next: List[A]) extends List[A]
case object Nil extends List[Nothing]因此,Nil是所有A的List[A],因为list的类型参数被定义为List[+A]。
发布于 2014-06-05 19:44:21
这不管用:
class Foo
abstract final class Xyzzy extends Foo
class Bar extends Fooscala> 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是由编译器专门处理的。
发布于 2014-06-05 20:44:01
我是说你能做到
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 = xhttps://stackoverflow.com/questions/24066364
复制相似问题