9

いろいろ検索しましたが、何も見つかりませんでした。このタイプのtype declarationScala での意味は何ですか?

type Ident >: Null <: AnyRef
4

3 に答える 3

15

Keywordtypeは型エイリアスの宣言用でvalあり、anddefは値とメソッドの宣言用です。この場合、それは制約付きの抽象型エイリアスであるため、一部の型メンバーtraitまたはclass- ローカル スコープの型エイリアスは抽象化できず、制約を持つこともできません。

TypeIdentは のサブタイプAnyRefおよびスーパータイプですNull

AnyRef

AnyRefIntLongなどを除くすべての型Char(Java プリミティブ)のすべての参照型の祖先です。

ヌル

Nullすべての「nullable」タイプのサブタイプです。実際、これはすべての参照型のサブタイプです。

すべてAnyRefが null 可能であるため、唯一の追加の制約>: NullIdentis notNothingです。

Scala の型階層を参照してください。

Scala の型階層

于 2013-08-05T09:30:44.610 に答える
7

@seniaの答えに追加するには:これは宣言ではなく、次のようなコンテキストで見つかった抽象型メンバー宣言です

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

and の具体的な実装でFooは、ある型を と定義する必要がありIdent、この型は @senia の回答で説明されている制約を満たさなければならないことを意味します。

于 2013-08-05T09:36:03.017 に答える
1

あなたの場合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このタイプは制約に違反しているため、ここに置くことはできません

于 2013-08-05T09:30:16.107 に答える