いろいろ検索しましたが、何も見つかりませんでした。このタイプのtype declaration
Scala での意味は何ですか?
type Ident >: Null <: AnyRef
いろいろ検索しましたが、何も見つかりませんでした。このタイプのtype declaration
Scala での意味は何ですか?
type Ident >: Null <: AnyRef
Keywordtype
は型エイリアスの宣言用でval
あり、anddef
は値とメソッドの宣言用です。この場合、それは制約付きの抽象型エイリアスであるため、一部の型メンバーtrait
またはclass
- ローカル スコープの型エイリアスは抽象化できず、制約を持つこともできません。
TypeIdent
は のサブタイプAnyRef
およびスーパータイプですNull
。
AnyRef
AnyRef
Int
、Long
などを除くすべての型Char
(Java プリミティブ)のすべての参照型の祖先です。
ヌル
Null
すべての「nullable」タイプのサブタイプです。実際、これはすべての参照型のサブタイプです。
すべてAnyRef
が null 可能であるため、唯一の追加の制約>: Null
はIdent
is notNothing
です。
Scala の型階層を参照してください。
@seniaの答えに追加するには:これは型宣言ではなく、次のようなコンテキストで見つかった抽象型メンバー宣言です
trait Foo { // or perhaps class
type Ident >: Null <: AnyRef
}
and の具体的な実装でFoo
は、ある型を と定義する必要がありIdent
、この型は @senia の回答で説明されている制約を満たさなければならないことを意味します。
あなたの場合Null
、のサブタイプでIdent
あり、AnyRef
そのスーパータイプです。この境界がない場合、すべてのタイプの共通のサブタイプは ですがNothing
、指定するとNull
、 Nothing がすべてのサブタイプ (Int、Long などを含む) の場合、 with はすべてのオブジェクトのサブタイプになります。
Null や Nothing などは Type System で使用され、基本的には型 (Contra/Co) variance で使用されます。例:
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
Int
このタイプは制約に違反しているため、ここに置くことはできません