首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:将类型放置在继承树的底部

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

Stack Overflow用户
提问于 2014-06-05 17:20:22
回答 3查看 153关注 0票数 3

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-05 20:37:16

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

代码语言:javascript
复制
case class ::[A](value: A, next: List[A]) extends List[A]
case object Nil extends List[Nothing]

因此,Nil是所有AList[A],因为list的类型参数被定义为List[+A]

票数 1
EN

Stack Overflow用户

发布于 2014-06-05 19:44:21

这不管用:

代码语言:javascript
复制
class Foo
abstract final class Xyzzy extends Foo
class Bar extends Foo
代码语言:javascript
复制
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是由编译器专门处理的。

票数 0
EN

Stack Overflow用户

发布于 2014-06-05 20:44:01

我是说你能做到

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24066364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档