>是什么意思:Null<:在Scala中?

时间:2013-08-05 09:21:47

标签: scala

我搜索了很多,但我没有找到任何内容,Scala中此类type declaration的含义是什么?

type Ident >: Null <: AnyRef

3 个答案:

答案 0 :(得分:13)

关键字type用于类型别名声明,就像valdef用于值和方法声明一样。在这种情况下,它是带有约束的抽象类型别名,因此它是某些traitclass的类型成员 - 本地范围内的类型别名不能是抽象的,也不能有约束。

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

<强> AnyRef

AnyRef是所有引用类型的祖先,除IntLongChar等所有类型(Java原语)。

<强>空

Null是所有“可空”类型的子类型。实际上它是所有引用类型的子类型。

由于所有AnyRef都可以为空,因此>: Null的唯一附加约束是Ident不是Nothing

请参阅Scala’s type hierarchy

Scala’s type hierarchy

答案 1 :(得分:7)

要添加到@ senia的答案:这不是类型声明,这是抽象类型成员声明,可在上下文中找到,如

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

并且意味着Foo的任何具体实现必须将某些类型定义为Ident,并且此类型必须满足@ senia的答案中描述的约束。

答案 2 :(得分:1)

在您的情况下,NullIdent的子类型,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

我们不能把Int放在这里,因为这种类型违反了约束