9

我搜索了很多,但我没有找到任何东西,type declarationscala中这种类型的含义是什么?

type Ident >: Null <: AnyRef
4

3 回答 3

15

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

类型Ident是 的子类型AnyRef和超类型Null

任意参考

AnyRef是所有引用类型、除IntLong等所有类型Char(Java 原语)之外的所有类型的祖先。

无效的

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

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

请参阅Scala 的类型层次结构

Scala 的类型层次结构

于 2013-08-05T09:30:44.610 回答
7

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

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

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

于 2013-08-05T09:36:03.017 回答
1

在你的情况下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这里,因为这种类型违反了约束

于 2013-08-05T09:30:16.107 回答