• scala之旅-核心语言特性【统一类型】(三)


    在Scala中,所有的值都有一个类型,包括数值和函数。下面的这张图阐释了类型的一个层次关系子集。

    Scala类型层次结构

    Any 是所有类型的父类型,也被称之为顶级类型。它里面定义的一些通用的方法,例如 equals,hashCode,和toString. Any 有两个直接的子类: AnyValAnyRef.

    AnyVal 代表的是值类型。 Scala预定义了9个值类型,值类型是不可以为空的,包括: Double,Float,Long,Int,Short,Byte,Char,Unit 以及 Boolean . Unit 是一个没有任何有意义信息的值类型。Unit 实际上就是约等于 () 对象。因为所有函数都必须要有返回,所以Unit是一个非常有用的返回类型。

    AnyRef 代表的是引用类型。所有的非值类型都会被定义为引用类型。 每一个用户自定义的类型在Scala中都是AnyRef的子类型。如果Scala在java 运行环境的上下文中其对标的是java.lang.Object。

    如下的例子演示了 String,Integer,Char,Boolean值和函数都是对象,与其他的对象没有区别。

    val list: List[Any] = List(
      "a string",
      732,  // an integer
      'c',  // a character
      true, // a boolean value
      () => "an anonymous function returning a string"
    )
    
    list.foreach(element => println(element))

    上面定义了一个类型为List[Any]的值 list。这个list 初始化了多个类型的节点,但是没有实例都是 Scala.Any 类型,所以可以添加到 list中去。

    下面就是上面代码的输出结果:

    a string
    732
    c
    true
    <function>

    类型转换

    值类型转换可以按照如下的方式进行

    例如:

    val x: Long = 987654321
    val y: Float = x  // 9.8765434E8 (note that some precision is lost in this case)
    
    val face: Char = '☺'
    val number: Int = face  // 9786

    转换是单向的,下面则不会被编译通过

    val x: Long = 987654321
    val y: Float = x  // 9.8765434E8
    val z: Long = y  // Does not conform

    当然也可以将引用类型强转为子类型。这个我们会在后面的章节介绍

    Nothing和Null

    Nothing 是所有类型的子类型,也被称之为底层类型。没有值是Nothing类型。一般的用途是用来标记一个非正常结束,例如抛异常,程序中断或者一个死循环(例如没有产生任何值的表达式,或者方法没有正常返回)

    Null 是所有引用类型的子集(类似于的 AnyRef是Any的子集)。它在语法上等同于关键字null。Null 的主要作用是与JVM语言的交互性,在scala中应该尽量避免出现。后面的章节将会介绍null的替换方案。

  • 相关阅读:
    javascript往textarea追加内容
    Java之Comparable接口和Comparator接口
    Java之iterator迭代器和iterable接口
    Java之hashSet实现引用类型的禁止重复功能
    Java之获取系统属性
    Java之String,StringBuffer,StringBuilder类
    Java之sleep和wait的区别
    Android开发之ADT中无Annotation Processin的解决办法
    Android开发之注解式框架ButterKnife在ADT中的设置
    Android开发UI之Action Bar
  • 原文地址:https://www.cnblogs.com/zhouwenyang/p/13856599.html
Copyright © 2020-2023  润新知