簡體   English   中英

在Scala中>> Null <:是什么意思?

[英]What is the meaning of >: Null <: in Scala?

我經常搜索,但是我沒有找到任何東西,Scala中這種type declaration的含義是什么?

type Ident >: Null <: AnyRef

關鍵字type用於類型別名聲明,就像valdef用於值和方法聲明一樣。 在這種情況下,它是帶有約束的抽象類型別名,因此它是某個traitclass的類型成員 - 本地范圍中的類型別名不能是抽象的,也不能有約束。

Type IdentAnyRef的子類型, Null超類型。

AnyRef

AnyRef是所有引用類型的祖先,除IntLongChar等之外的所有類型(Java原語)。

空值

Null是所有“可空”類型的子類型。 實際上它是所有引用類型的子類型。

由於所有AnyRef空,因此唯一的附加約束是>: NullIdent不是Nothing

請參閱Scala的類型層次結構

Scala的類型層次結構

要添加到@ senia的答案:這不是類型聲明,這是一個抽象類型成員聲明,在上下文中找到

trait Foo { // or perhaps class
  type Ident >: Null <: AnyRef
}

並且意味着Foo任何具體實現都必須將某些類型定義為Ident ,並且此類型必須滿足@ senia的答案中描述的約束。

在你的情況下, NullIdent的子類型, AnyRef是它的超類型。 在沒有這個邊界的情況下,所有類型的公共子類型都是Nothing ,但是您將其指定為Null ,當Nothing是所有對象的子類型(包括Int,Long等等)時,它是所有對象的子類型。

類型系統中使用Null和Nothing之類的東西,基本上是類型(Contra / Co)方差。 例:

sealed trait Container[+A >: Null <: AnyRef]
case class Full[A >: Null <: AnyRef](value: A) extends Container[A]
case object Empty extends Container[Null]

這個編譯完美

val c: Container[String] = Full("String")
val e: Container[String] = Empty

但這失敗了,因為我們的下限是Null,而upper是AnyRef:

val ff: Container[Int] = Full(10)
val f: Container[Int] = Empty

我們不能把Int這個類型違反了約束

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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