[英]What is the meaning of >: Null <: in Scala?
我經常搜索,但是我沒有找到任何東西,Scala中這種type declaration
的含義是什么?
type Ident >: Null <: AnyRef
關鍵字type
用於類型別名聲明,就像val
和def
用於值和方法聲明一樣。 在這種情況下,它是帶有約束的抽象類型別名,因此它是某個trait
或class
的類型成員 - 本地范圍中的類型別名不能是抽象的,也不能有約束。
Type Ident
是AnyRef
的子類型, Null
超類型。
AnyRef
AnyRef
是所有引用類型的祖先,除Int
, Long
, Char
等之外的所有類型(Java原語)。
空值
Null
是所有“可空”類型的子類型。 實際上它是所有引用類型的子類型。
由於所有AnyRef
空,因此唯一的附加約束是>: Null
是Ident
不是Nothing
。
請參閱Scala的類型層次結構 :
要添加到@ senia的答案:這不是類型聲明,這是一個抽象類型成員聲明,在上下文中找到
trait Foo { // or perhaps class
type Ident >: Null <: AnyRef
}
並且意味着Foo
任何具體實現都必須將某些類型定義為Ident
,並且此類型必須滿足@ senia的答案中描述的約束。
在你的情況下, Null
是Ident
的子類型, 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.