我刚读过:http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
据我所知,这Null
是一个特点,它的唯一例子是null
.
当一个方法采用Null参数时,我们只能传递一个Null
引用或null
直接传递它,但不能传递任何其他引用,即使它是null(nullString: String = null
例如).
我只是想知道在哪些情况下使用这个Null
特性可能会有用.还有没有什么特质,我真的没有看到更多的例子.
我真的不明白使用Nothing和Unit作为返回类型之间的区别是什么,因为两者都没有返回任何结果,当我有一个执行日志记录的方法时,如何知道使用哪一个?
除了返回类型之外,您是否将Unit/Null/Nothing用作其他东西?
Nat*_*hes 77
如果方法永远不会返回,则只使用Nothing(意味着它不能通过返回正常完成,它可能会抛出异常).没有什么是永远不会被实例化的,并且有利于类型系统(引用James Iry:"Scala底部类型的原因与它在类型参数中表达方差的能力有关.").从您链接到的文章:
Nothing的另一个用途是作为永不返回的方法的返回类型.如果你考虑它就有意义了.如果方法的返回类型为Nothing,并且绝对没有Nothing的实例,那么这样的方法必须永远不会返回.
您的日志记录方法将返回Unit.有一个值单位,所以它实际上可以返回.来自API文档:
Unit是scala.AnyVal的子类型.只有一个类型为Unit,()的值,并且它不由底层运行时系统中的任何对象表示.返回类型为Unit的方法类似于声明为void的Java方法.
pag*_*_5b 18
你引用的文章可能会产生误导.该Null
类型用于与Java虚拟机兼容,特别是Java.
我们必须考虑Scala:
null
对访问的引用,例如Java库和代码因此,有必要为null
值定义一个类型,即Null
特征,并将其null
作为唯一的实例.
Null
除非您是类型系统或正在编译器上进行开发,否则在类型中没有什么特别有用的.特别是我看不出Null
为方法定义类型参数的任何合理的理由,因为你不能传递任何东西null
EEC*_*LOR 15
除了返回类型之外,您是否将Unit/Null/Nothing用作其他东西?
Unit
可以像这样使用:
def execute(code: => Unit):Unit = {
// do something before
code
// do something after
}
Run Code Online (Sandbox Code Playgroud)
这允许您传入要执行的任意代码块.
Null
可以用作可为空的任何值的底部类型.一个例子是:
implicit def zeroNull[B >: Null] =
new Zero[B] { def apply = null }
Run Code Online (Sandbox Code Playgroud)
Nothing
用于定义 None
object None extends Option[Nothing]
Run Code Online (Sandbox Code Playgroud)
这允许您指定None
任何类型的Option
因为Nothing
'扩展'一切.
val x:Option[String] = None
Run Code Online (Sandbox Code Playgroud)
如果你使用Nothing
,没有事情要做(包括打印控制台),如果你做某事,使用输出类型Unit
object Run extends App {
//def sayHello(): Nothing = println("hello?")
def sayHello(): Unit = println("hello?")
sayHello()
}
Run Code Online (Sandbox Code Playgroud)
......然后怎么用Nothing
?
trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]
Run Code Online (Sandbox Code Playgroud)
我从来没有真正使用过该Null
类型,但你使用的Unit
是java使用的地方void
.Nothing
是一种特殊的类型,因为正如内森已经提到的那样,没有实例Nothing
.Nothing
是一种所谓的底部类型,这意味着它是任何其他类型的子类型.这个(以及逆变型参数)就是为什么你可以将任何值前置Nil
- 这是一个List[Nothing]
- 然后列表将是这个元素类型.None
如果是类型的话Option[Nothing]
.每次尝试访问此类容器中的值都会引发异常,因为它是从类型方法返回的唯一有效方法Nothing
.
归档时间: |
|
查看次数: |
56000 次 |
最近记录: |