Scala中的Any、Nothing、Null、Nil

2024-08-24 10:58
文章标签 scala null nil nothing

本文主要是介绍Scala中的Any、Nothing、Null、Nil,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Scala中的Any、Nothing、Null、Nil

Any

在scala中,Any类是所有类的超类。Any有两个子类:AnyVal和AnyRef。

对于直接类型的scala封装类,如Int、Double等,AnyVal是它们的基类;对于引用类型,AnyRef是它们的基类。

Any是一个抽象类,它有如下方法:!=()、==()、asInstanceOf()、equals()、hashCode()、isInstanceOf()和toString()。

AnyVal没有更多的方法了。AnyRef则包含了Java的Object类的一些方法,比如notify()、wait()和finalize()。

AnyRef是可以直接当做java的Object来用的。对于Any和AnyVal,只有在编译的时候,scala编译器才会将它们视为Object。换句话说,在编译阶段Any和AnyVal会被类型擦除为Object。

Nothing

如上图所示,Nothing是所有类的子类,是一个类。Nothing没有对象,但是可以用来定义类型。

在Java当中你很难找到类似的东西对应Scala中的Nothing。Nothing到底是什么呢?或者换个方向考虑:Nothing的用处是什么呢?

  1. 用于标记不正常的停止或者中断
  2. 一个空的collection
scala> def foo = throw new RuntimeException
foo: Nothing
scala> val l:List[Int] = List[Nothing]()
l: List[Int] = List()

因为List[+A]定义是协变的,所以List[Nothing]List[Int]的子类,但List[Null]不是List[Int]的子类

Null

Null是所有AnyRef的子类,是所有继承了Object的类的子类,所以Null可以赋值给所有的引用类型(AnyRef),不能赋值给值类型(AnyVal),这个java的语义是相同的。null是Null的唯一对象。

val x = null         // x: Null
val y: String = null // y: String = null
val z: Int = null    // error: type mismatch
val u: Unit = null   // u: Unit = ()

注意,不要被Unit值类型在赋值时的障眼法给骗了,以为null可以被赋给Unit。实际上把任何表达式结果不是Unit类型的表达式赋给Unit类型变量,都被转为{ expr; () },所以上面的等同于{null; ()}把最终得到的()赋给了u变量。

Null在类型推导时只能被造型为AnyRef分支下的类型,不能造型为AnyVal分支下的类型,不过我们显式的通过asInstanceOf操作却又是可以把null造型为AnyVal类型的:

val i = null.asInstanceOf[Int]
// 类似于java里的 int i = (int)((Integer)null);

先装箱Int为引用类型,null被造型成了引用类型的Int(java.lang.Integer),然后又做了一次拆箱,把一个为nullInteger类型变量造型成Int值类型,但在拆箱这一点处理上,体现了scala与java的不同:

// java里,编译通过,运行失败,空指针异常
int i = (int)((Integer)null);// scala里,把值为null的Integer拆箱为值类型Int是ok的,得到Int的默认值0
val i = null.asInstanceOf[java.lang.Integer].asInstanceOf[Int]

在java里基本类型(primitive type) 与引用类型是有明确差异的,虽然提供了自动装箱拆箱的便捷,但在类型上两者是不统一的;而scala里修正这一点,Int类型不再区分int/Integer,类型一致,所以值为nullInteger在通过asInstanceOf[Int]时被当作一个未初始化的Int对待,返回了一个默认值Int(注:asInstanceOf不改变原值,返回一个新值)。

Nil

Nil是一个空的List,定义为List[Nothing],根据List的定义List[+A],所有Nil是所有List[T]的子类。

这篇关于Scala中的Any、Nothing、Null、Nil的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102287

相关文章

Cannot read property ‘length‘ of null while opening vscode terminal

同一问题地址:Cannot read property ‘length’ of null while opening vscode terminal 问题描述 One day, 我在ubuntu 18.04下用vscode打开一个项目,并想和往常一样在vscode使用终端,发现报错Cannot read property 'length' of null。 解决 打开setting.jso

非空约束(Not Null)

修改表添加非空约束 使用DDL语句添加非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL; 示例: 向emp表中的salary添加非空约束。 alter table emp modify salary float(8,2) not NULL; 删除非空约束 使用DDL语句删除非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NULL;

FORM的ENCTYPE=multipart/form-data 时request.getParameter()值为null问题的解决

此情况发生于前台表单传送至后台java servlet处理: 问题:当Form需要FileUpload上传文件同时上传表单其他控件数据时,由于设置了ENCTYPE=”multipart/form-data” 属性,后台request.getParameter()获取的值为null 上传文件的参考代码:http://www.runoob.com/jsp/jsp-file-uploading.ht

Java中Map取值转String Null值处理

Map<String, Object> 直接取值转String String value = (String)map.get("key") 当map.get(“key”)为Null值时会报错。 使用String类的valueOf静态方法可以解决这个问题 String value = String.valueOf(map.get("key"))

NULL 輸出情況

NULL值 輸出情況區分 匯總圖片 select 空 param1 -> param1:null select param1 from 空 —> param1:空 NULL 值出現在查詢結果中 只能由 SELELCT 和 聚合函數 產生 而不是 LIMIT WHERE HAVING FROM 語句 REFERENCE Leetcode 解析

王立平--AES加密图片实现 SkImageDecoder::Factory return null

这个问题是在加密图片,存入sd卡,在解密出来展示,出现的。我个人研究了很久没解决。最后经过高人指点,终于解决了。 在此,拿出来分享,希望各位少走弯路。 我之前的设计思路是:(可以不看哦) 1.把图片从drawable读入成bitmap 2.bitmap-->byte 3.调用AES的byte加密算法。 4.加密成byte,在转化为string 5,把string存入sd卡。

【scala 安装错误】错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner

错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 原因: Scala安装路径中包含空格。 解决办法:scala 不要安装在E:\Program Files 这种有空格的目录下,简直坑

nil和Nil的区别

1、nil   nil一般是指把一个对象置空,既完全是一个空对象,完全从内存中释放。   2、Nil   Nil和nil基本没有任何区别,也可以说只要是可以使用nil的地方都可以使用Nil,反之亦然。但是作为程序猿,我们应该更加严谨一些。nil和Nil的区别在于,nil表示置空一个对象,二Nil表示置空一个类。

JavaScript学习(二):原始数据类型-字符串、数字、布尔值、null、undefined

数据类型 --- 能够表示并操作值的类型,编程语言的最基本特性就是能够支持多种数据类型。 JavaScript的数据类型分为两种: 原始类型 (primitive type)  对象类型(object type) 原始数据类型包括:  数字   字符串  布尔值   , 特殊的原始值:null  undefined,不是数字、字符串和布尔值,代表了各自特殊类型

Scala模式匹配下提取器构造

示例代码: object :> {def unapply[A] (list:List[A]) = {Some( (list.init,list.last) )}}object Extractor_Advanced {def main(args: Array[String]): Unit = {(1 to 9).toList match{ case _ :> 9 => println(