【问题标题】:Scala: Placing type at bottom of inheritance treeScala:将类型放在继承树的底部
【发布时间】:2014-06-05 17:20:22
【问题描述】:

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

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

【问题讨论】:

标签: scala inheritance bottom-type


【解决方案1】:

有可能接近你想要做的想法。这不是继承链中所有类型的通用“底部”类型。相反,它是特定于使用泛型的特征的底层类型。您需要在继承结构内的类型定义中重用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[+A]。

【讨论】:

    【解决方案2】:

    这不起作用:

    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 是由编译器专门处理的。

    【讨论】:

      【解决方案3】:

      我的意思是你可以这样做

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        相关资源
        最近更新 更多