2013-08-05 14 views
5

私は多くを検索しましたが、何も見つかりませんでした。このタイプの意味はScalaのtype declarationとは何ですか?あなたのケースNull>の意味は?:Null <:in Scala?

type Ident >: Null <: AnyRef 

答えて

12

キーワードtype型エイリアス宣言のためのもので、ちょうどvaldefは値とメソッドの宣言のためのものです。この場合、それは制約付きの抽象型エイリアスなので、タイプメンバであるtraitまたはclass - ローカルスコープ内の型エイリアスは抽象的ではなく、制約を持つことはできません。

タイプIdentは、サブタイプがAnyRefで、スーパータイプがNullです。

AnyRef

AnyRefは、(Javaのプリミティブ)にIntLongCharなどを除くすべてのタイプのすべての参照型の祖先です。

ヌル

Nullは全て "NULL可能" タイプのサブタイプです。実際、それはすべての参照型のサブタイプです。

AnyRefはすべてヌル入力可能なため、>: Nullからの唯一の追加制約は、IdentNothingではありません。

Scala’s type hierarchyを参照してください:

Scala’s type hierarchy

+0

すぐにフォローアップの質問があります(私は興味があります)、ここでは余分な下限はありませんか? 'Null'はすべての参照型のサブタイプであり、その型は既に*すべての参照型*として定義された上限を持っていますから? –

+0

ありがとう、私は階層を知っているが、私の質問はこのコマンドを意味するものだった – Pooya

+1

@Patrykíwiek:そうだね。しかし、ヌル型は、値が「ヌル」である可能性があるという明示的な警告として言及することができる。 – senia

1

IdentAnyRefのサブタイプは、そのスーパータイプです。この境界がない場合、すべてのタイプの共通サブタイプは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で、上位AnyRefであるため、これは、失敗します。

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

私たちは、このbeacuseここIntを置くことができませんタイプが制約を破る

7

の@セニアの答えに追加するには:これは、タイプ宣言ではありません、これは

のような文脈で見 抽象型メンバー宣言であり、
trait Foo { // or perhaps class 
    type Ident >: Null <: AnyRef 
} 

の具体的な実装では、FooのいずれかのタイプをIdentであり、このタイプは@ seniaの答えに記述されている制約を満たさなければなりません。

+0

はい、この型の定義は特色でした – Pooya

関連する問題