【发布时间】:2013-08-05 22:48:59
【问题描述】:
我搜了很多,但没有找到,这种type declaration在Scala中是什么意思?
type Ident >: Null <: AnyRef
【问题讨论】:
标签: scala
我搜了很多,但没有找到,这种type declaration在Scala中是什么意思?
type Ident >: Null <: AnyRef
【问题讨论】:
标签: scala
关键字type 用于类型别名声明,就像val 和def 用于值和方法声明一样。在这种情况下,它是一个带有约束的抽象类型别名,因此它是某些 trait 或 class 的类型成员 - 本地范围内的类型别名不能是抽象的,也不能有约束。
类型Ident 是AnyRef 的子类型和Null 的超类型。
AnyRef
AnyRef 是所有引用类型的祖先,除了Int、Long、Char 等(Java 原语)之外的所有类型。
空
Null 是所有“可空”类型的子类型。实际上它是所有引用类型的子类型。
由于所有AnyRef 都可以为空,因此>: Null 的唯一附加约束是Ident 不是Nothing。
【讨论】:
Null 是所有引用类型的子类型,并且该类型的上限已经定义为任何引用类型?
Null 类型可以作为明确的警告被提及,该值可能是null。
>: Null Ident 不能是Nothing。
null 作为任何引用类型的值 (AnyRef):null: String。 >: Null这里的意思是Ident不能是Nothing。
补充@senia 的答案:这不是一个type 声明,这是一个抽象类型成员 声明,可以在类似
的上下文中找到trait Foo { // or perhaps class
type Ident >: Null <: AnyRef
}
并且意味着Foo 的任何具体实现都必须将某个类型定义为Ident,并且该类型必须满足@senia 的答案中描述的约束。
【讨论】:
在您的情况下,Null 是 Ident 的子类型,AnyRef 是它的超类型。在没有这个界限的情况下,所有类型的公共子类型是Nothing,但你指定它是Null,当Nothing 是所有对象的子类型(包括Int、Long 等)时,with 是所有对象的子类型。
类型系统中使用了 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放在这里,因为这种类型违反了限制
【讨论】: