[英]Scala: Placing type at bottom of inheritance tree
Scala定義了一個名為Nothing
的類型,它是所有類型的子類型。 是否可以定義我們自己的“底部類型”,它應該位於從給定超類型擴展的繼承樹的底部?
例如,假設我有一些類型Foo
,我想說Xyzzy
應該位於Foo
的繼承樹的底部 - 換句話說,它應該繼承自Foo繼承的任何東西。 如果我們介紹一個新類型的Bar
,和Bar <: Foo
,那么Xyzzy <: Bar
。 我基本上都在尋找一種方法來說class Xyzzy isBottom Foo { ... }
。 有沒有辦法直接實現這一目標,或間接實現這一效果?
有可能接近你想要的想法。 對於繼承鏈中的所有類型,這不是一般的“底部”類型。 相反,它是特定於使用泛型的特征的底部類型。 您需要在繼承結構中的類型定義中重用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]
。
這不起作用:
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
是由編譯器專門處理的。
我的意思是你可以做到這一點
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.