X>中null的目的是什么:Null <:Y?

Roy*_*man 1 scala

例如:

abstract type
ClassSymbol >: Null <: Universe.TypeSymbol with Universe.ClassSymbolApi
Run Code Online (Sandbox Code Playgroud)

这是在这里找到的.我意识到这有什么描述,但从语法的角度来看,我无法理解它.

Null的目的是什么?看起来它可能是某种默认值,但我只是猜测,因为我只看到这种类型的语法,并且我认为null可以是类型的返回,而不会破坏程序.这是一个抽象类型,但它没有您稍后可以指定的参数,那么它如何作为抽象类型工作?

Rex*_*err 5

Null是一种指定可以存在的类型null.严格来说,它不是超类型,因为你不能做任何事情,null除非传递它并检查,是的,它仍然是null.通过这种方式,它非常像Nothing,除了你甚至无法得到一个Nothing传递的实例.

现在,人们可以说,"好吧,任何人AnyRef都可以null",但那你怎么看待这个实例null呢? null可以填写几乎任何东西,作为一种类型,意味着它必须是所有可能的子类型null!这Null就是:所有可能的子类型Null.

等等,你说.你实际上不能拥有所有东西的子类型 - 这意味着null它将拥有所有可能的功能!如果您考虑一下,它null 承诺任何类型的功能AnyRef- 但它们都是空洞的承诺,并且每当您尝试使用该功能时,您都会获得相应的功能NullPointerException.

现在,问题是,为什么要创建一个类型>: Null(意味着它null是一个有效的值)而不是<: AnyRef它应该意味着相同的东西?

好吧,事实证明Scala实际上并没有这样做的东西,留下你可能拥有一个AnyRef你绝对不可能的东西的可能性null.因此,要求<: AnyRef("我是AnyRef的子类")在理论上并不意味着同样的事情,即使在实践中绝对不是null AnyRef也没有真正实现.(另外,Any如果Null不是一个明确的类型,会变得非常尴尬.)

所以type Foo >: Null <: Bar只是意味着你明确承认null可以填写任何可能类型的实例Foo,因此你可以写val foo: Foo = null.