簡體   English   中英

Scala:在繼承樹的底部放置類型

[英]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是所有AList[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM