Scala 中的底类型(bottom types)
在Scala中存在两个比较特殊的类,Scala.Null和Scala.Nothing。它们是Scala面向对象的类型系统用于处理一些“极端情况”的特殊类型。
Null类是null引用的类型,他是每个引用类(即继承自AnyRef的类)的子类,null值可以用来给引用类初始化。但是Null并不兼容于值类型,即你不可能将null赋值给一个整数变量:
val i: Int = null
以上写法是不对的。
Nothing位于Scala类继承关系的最底部,它是每个其他类型的子类型,并且,不存在这个类型的任何值。那么,Nothing类型的意义何在呢?
作为参数类型。
在Scala的List中有一个特殊的存在,Nil,如果使用过Nil你就会发现,Nil实际上就是一个List[Nothing]。所以Nil可以与任何类型的元素进行集合的相关操作,例如1 ::Nil,”abc” :: Nil,最终得到的集合结果会根据添加的元素类型决定,因为Nothing是任何类的子类,它可以被归为任何List中去。
非正常终止信号
在Scala中抛出异常跟Java一样,需要创建一个异常对象然后用throw关键字将它抛出:
throw new IllegalArgumentException
并且,在Scala中,抛出异常的动作throw是一个有结果类型的表达式,这个结果的类型就是Nothing。如下示例:
val half:Int =
If ( n % 2 == 0)
n / 2
else
throw new RuntimeException(“n must be even”)
在这段代码中,如果n是偶数,那么half会被赋值为n的一半,如果n不是偶数那么half被初始化之前,就会有异常抛出。而你如此写不用担心half的类型问题,因为技术上讲,抛出异常这个表达式的类型是Nothing。在这个场景下,if的一个分支计算出某个值,而另一个分支抛出异常并计算出Nothing,整个if表达式的类型就是那个计算出某个值的分支。
再举例来说,在Scala的标准类库中Predef对象有一个error方法,其定义如下:
def error(message:String):Nothing =
throw new RuntimeException(message)
error方法的返回值类型是Nothing,这告诉使用方该方法并不会正常返回,它会抛出异常。对error的使用如下:
def divide(x: Int, y: Int): Int =
if (y != 0) x / y
else error(“can’t divide by zero”)
这里的x/y条件判断的then分支的类型为Int,而else分支类型为Nothing,由于Nothing是Int的子类型,整个条件判断表达式的类型就是Int,正如方法声明要求的那样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通