私は多くを検索しましたが、何も見つかりませんでした。このタイプの意味はScalaのtype declaration
とは何ですか?あなたのケースNull
に>の意味は?:Null <:in Scala?
type Ident >: Null <: AnyRef
私は多くを検索しましたが、何も見つかりませんでした。このタイプの意味はScalaのtype declaration
とは何ですか?あなたのケースNull
に>の意味は?:Null <:in Scala?
type Ident >: Null <: AnyRef
キーワードtype
型エイリアス宣言のためのもので、ちょうどval
とdef
は値とメソッドの宣言のためのものです。この場合、それは制約付きの抽象型エイリアスなので、タイプメンバであるtrait
またはclass
- ローカルスコープ内の型エイリアスは抽象的ではなく、制約を持つことはできません。
タイプIdent
は、サブタイプがAnyRef
で、スーパータイプがNull
です。
AnyRef
AnyRef
は、(Javaのプリミティブ)にInt
、Long
、Char
などを除くすべてのタイプのすべての参照型の祖先です。
ヌル
Null
は全て "NULL可能" タイプのサブタイプです。実際、それはすべての参照型のサブタイプです。
AnyRef
はすべてヌル入力可能なため、>: Null
からの唯一の追加制約は、Ident
はNothing
ではありません。
はScala’s type hierarchyを参照してください:
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で、上位AnyRefであるため、これは、失敗します。
val ff: Container[Int] = Full(10)
val f: Container[Int] = Empty
私たちは、このbeacuseここInt
を置くことができませんタイプが制約を破る
の@セニアの答えに追加するには:これは、タイプ宣言ではありません、これは
のような文脈で見 抽象型メンバー宣言であり、trait Foo { // or perhaps class
type Ident >: Null <: AnyRef
}
の具体的な実装では、Foo
のいずれかのタイプをIdent
であり、このタイプは@ seniaの答えに記述されている制約を満たさなければなりません。
はい、この型の定義は特色でした – Pooya
すぐにフォローアップの質問があります(私は興味があります)、ここでは余分な下限はありませんか? 'Null'はすべての参照型のサブタイプであり、その型は既に*すべての参照型*として定義された上限を持っていますから? –
ありがとう、私は階層を知っているが、私の質問はこのコマンドを意味するものだった – Pooya
@Patrykíwiek:そうだね。しかし、ヌル型は、値が「ヌル」である可能性があるという明示的な警告として言及することができる。 – senia