我搜索了很多,但我没有找到任何东西,type declaration
scala中这种类型的含义是什么?
type Ident >: Null <: AnyRef
关键字type
用于类型别名声明,就像val
和def
用于值和方法声明一样。在这种情况下,它是一个带有约束的抽象类型别名,因此它是 some 的类型成员,trait
或者class
- 本地范围内的类型别名不能是抽象的,也不能有约束。
类型Ident
是 的子类型AnyRef
和超类型Null
。
任意参考
AnyRef
是所有引用类型、除Int
、Long
等所有类型Char
(Java 原语)之外的所有类型的祖先。
无效的
Null
是所有“可为空”类型的子类型。事实上,它是所有引用类型的子类型。
由于所有AnyRef
都是可以为空的,因此唯一的附加约束>: Null
是Ident
not Nothing
。
请参阅Scala 的类型层次结构:
添加到@senia 的答案:这不是类型声明,这是一个抽象类型成员声明,可以在上下文中找到,例如
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
这里,因为这种类型违反了约束