2013-08-05 25 views

回答

12

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

類型IdentAnyRef和超類型Null的子類型。

AnyRef

AnyRef是所有引用類型的祖先,各類除了IntLongChar等(Java原始)。

Null是所有 「可空」 類型的子類型。實際上它是所有參考類型的一個子類型。

因爲所有AnyRef都是可以爲空的,所以>: Null的唯一附加約束是Ident不是Nothing

Scala’s type hierarchy

Scala’s type hierarchy

+0

然後一個快速的後續問題(因爲我很好奇),是不是在這裏的下界是多餘的?由於'Null'是所有引用類型的子類型,並且類型已經將上限定義爲*任何引用類型*? –

+0

謝謝,我知道層次結構,但我的問題是什麼意思這個命令 – Pooya

+1

@PatrykĆwiek:我想是的。但是'Null'類型可以被視爲明確的警告,即值可能爲'null'。 – senia

1

在你的情況NullIdentAnyRef是它的超類型的子類型。在沒有這個邊界的所有類型的常見的亞型是Nothing,但您可以指定它是Null,用的是所有對象的亞型時,沒有什麼是一切的一種亞型(包括的int,long等)

之類的東西類型系統中使用空和無,基本上是類型(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 

但失敗了,因爲我們的下限是零和上是AnyRef:

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

我們不能把Int這裏怎麼一回事,因爲這類型違反約束條件

7

要添加到@塞尼亞的回答是:這不是一個類型聲明,這是一個抽象類型成員聲明,在上下文中找到喜歡

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

並且意味着Foo的任何具體實現必須定義某種類型爲Ident,這種類型必須滿足@ senia的答案中描述的限制。

+0

是的,這個類型定義屬於特徵 – Pooya