我刚读: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
据我了解, Null
是一个特点和它的唯一实例为null
。
当一个方法需要一个Null参数,那么我们只能传递一个Null
引用或null
直接,但不排除任何其它的参考,即使它是空( nullString: String = null
例如)。
我只是想知道在使用此情况下, Null
特征可能是有用的。 也有没有什么特点了,我真的没有看到任何更多的例子。
我真的不明白要么就是使用没有与单位作为返回类型之间的区别,因为两者不返回任何结果,怎么知道什么时候我有一个执行日志记录的方法。例如使用哪一个?
你有单位/空/没有的用途为除返回类型其他什么东西?
Answer 1:
你只用咱这方法从不返回(这意味着它不能被恢复正常完成,它可以抛出一个异常)。 没有什么是从来没有实例化,是有类型系统的好处(报价詹姆斯IRY: “之所以Scala有一个底部类型依赖于它来表达类型参数变化的能力。” )。 从你的文章链接到:
另外一个没有使用的是作为返回类型为一去不复返的方法。 这是有道理的,如果你想想看。 如果一个方法的返回类型是什么,绝对不存在没有的情况下,那么这种方法必须一去不复返。
你测井方法将返回单位。 有一个值单位,因此实际上可以返回。 从API文档 :
单位是scala.AnyVal的亚型。 只有一种类型的单元,()的值,并且它不是由在底层运行时系统的任何对象表示。 与返回类型单元的方法是类似的,其宣布无效的Java方法。
Answer 2:
你引用的文章可能会产生误导。 所述Null
类型是存在的,用于与Java虚拟机的兼容性,和Java尤其如此。
我们必须考虑到斯卡拉 :
- 完全面向对象的:每一个值是一个目的
- 是强类型:每个值必须有一个类型
- 需要处理
null
访问,引用例如,Java库和代码
因此有必要定义用于一个类型null
值,它是Null
的性状,并且具有null
作为其唯一的实例。
有没有在特别有用Null
类型,除非你是类型系统或你的编译器开发。 尤其是我看不到任何理由懂事定义一个Null
类型参数的方法,因为你不能传递任何东西,但null
Answer 3:
你有单位/空/没有的用途为除返回类型其他什么东西?
Unit
可以使用这样的:
def execute(code: => Unit):Unit = {
// do something before
code
// do something after
}
这使您可以在代码中的任意块传递给被执行。
Null
可作为底类型,它可为空的任意值。 一个例子是这样的:
implicit def zeroNull[B >: Null] =
new Zero[B] { def apply = null }
Nothing
在定义中使用None
object None extends Option[Nothing]
这允许您指定一个None
任何类型的Option
,因为Nothing
“延伸”的一切。
val x:Option[String] = None
Answer 4:
我从来没有实际使用的Null
类型,但您使用Unit
,在那里你会在Java的使用void
。 Nothing
是一种特殊类型的,因为作为弥敦道已经提到的,不能有任何的情况下Nothing
。 Nothing
是所谓的底部型的,这意味着,它是一个子类型的任何其它类型的。 这(和逆变类型参数)就是为什么你可以在前面加上任意值Nil
-这是一个List[Nothing]
-然后列表将是这个元素的类型。 None
也如果类型的Option[Nothing]
。 每一个尝试访问该容器内的值会抛出一个异常,因为它是唯一有效的方法,从类型的方法返回Nothing
。
Answer 5:
如果你使用Nothing
,有没有事做(包括打印控制台),如果你做的事情,用输出型Unit
object Run extends App {
//def sayHello(): Nothing = println("hello?")
def sayHello(): Unit = println("hello?")
sayHello()
}
...那么如何使用Nothing
?
trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]
Answer 6:
没有什么是常常隐式使用。 在下面的代码, val b: Boolean =
if (1 > 2) false
else throw new RuntimeException("error")
else子句是类型没有什么 ,这是布尔的子类的(以及任何其他AnyVal)。 因此,整个分配是有效的编译器,虽然else子句并没有真正返回任何东西。
Answer 7:
下面是一个例子Nothing
从scala.predef
:
def ??? : Nothing = throw new NotImplementedError
如果你不熟悉(和搜索引擎无法搜索就可以了) ???
是Scala的对任何有尚未实施的占位符的功能。 就像科特林的TODO
。
创建模拟对象时,可以使用同样的伎俩:覆盖使用自定义未使用的方法notUsed
方法。 不使用的优点???
是,你不会得到编译东西你永远不打算实施警告。
Answer 8:
在类别理论没有什么方面是初始对象和单元是一个终端对象 。
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
初始对象也被称为共边界或通用的 ,并且终端的对象也被称为最终 。
如果一个对象是在初始和终端 ,它被称为零对象或空对象。
文章来源: Usages of Null / Nothing / Unit in Scala