常用类型操作
操作名 | 例子 | 描述 |
---|---|---|
asInstanceOf[type] | asInstanceOf[Long] | 把一个值转换为另一个指定类型的值, 如果不兼容会报错 |
getClass | 5.getClass | 获取这个值的类型 |
isInstanceOf[type] | 5.isInstanceOf[Float] | 这个值有给定类型返回true |
toString | 5.toString | 显示为字符串 |
hashCode | “a”.hashCode | 返回hash值 |
to |
20.toByte | 类型转换 |
asInstanceOf[type] 少用, 无法转换会报错
结构图
Scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any。统一类型,是Scala的又一大特点。更特别的是,Scala中还定义了几个底层类(Bottom Class),比如Null和Nothing。
1) Null是所有引用类型的子类型,而Nothing是所有类型的子类型。Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型,但是不能赋值给值类型。
2) Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容。
3) Unit类型用来标识过程,也就是没有明确返回值的函数。 由此可见,
Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义
(1)Scala中一切数据都是对象,都是Any的子类
(2)Any是所有类型的超类型,也称为顶级类型,它定义了某些通用的方法,例如: equals,hashCode,和 toString
(3)Any有两个直接子类:AnyVal 表示值类型和 AnyRef表示引用类型
AnyVal表示值类型:
有九种预定义的值类型和它们是不可为空:Double,Float, Long, Int, Short, Byte, Char, Unit,和 Boolean。
Unit 是一种不携带任何有意义信息的值类型,正好有一个实例 Unit 可以像这样从字面上声明: () ,所有函数都必须返回一些东西,所以有时 Unit 是一个有用的返回类型。
AnyRef 表示引用类型:
所有非值类型都定义为引用类型,Scala 中的每个用户定义类型都是 AnyRef , 如果在 Java 运行时环境的上下文中使用 Scala,则 AnyRef 对应于 java.lang.Object
(4)这是一个示例,它演示了字符串、整数、字符、布尔值和函数的类型Any,就像其他所有对象一样:
val list: List[Any] = List(
"string", //String
732, //integer
'c', //character
true, //boolean value
() => "1" //返回字符串的匿名函数
)
list.foreach(test => println(test))
//它定义了一个list类型的值List[Any],该列表使用各种类型的元素进行初始化,但每个元素都是 的实例scala.Any,因此您可以将它们添加到列表中
//这是程序的输出:
a string
732
c
true
<function0>
scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any.都是Any的子类
统一类型,是scala的一个特点,scala还定义了几个底层类(Bottom Class),比如Null和Nothing
- Null是所有引用类型的子类型,而Nothing是所有类型的子类型.Null类只有一个实例对象,null,类似于java中的null引用.null可以赋值给任意引用类型,但是不能赋值给值类型
- Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容
- Unit类型用来标识过程,也就是没有明确返回值的函数, 类似java的void, 是一个数据类型, 只有1个对象就是(), Unit是一个数据类型
- Stringops是对java中的string的增强
- 遵守低精度的值类型向高精度类型, 自动转换(隐式转换)
常用类型
scala和java一样,
有7种数值类型Byte, Char, Short, Int, Long, Float和Double(无包装类型)和一个Boolean类型
Byte | 8位, 有符号 |
---|---|
Boolean | true 或者 false |
Short | 16位, 有符号 |
Int | 32位, 有符号 |
Long | 64位, 有符号 |
Char | 16位, 无符号 |
Float | 32位, 单精度浮点数 |
Double | 64位, 双精度浮点数 |
String | 其实就是由Char数组组成 |
与Java中的数据类型不同,Scala并不区分基本类型和引用类型,所以这些类型都是对象,可以调用相对应的方法。String直接使用的是java.lang.String. 不过,由于String实际是一系列Char的不可变的集合,Scala中大部分针对集合的操作,都可以用于String,具体来说,String的这些方法存在于类scala.collection.immutable.StringOps中。
由于String在需要时能隐式转换为StringOps,因此不需要任何额外的转换,String就可以使用这些方法。
每一种数据类型都有对应的Rich*类型,如RichInt、RichChar等,为基本类型提供了更多的有用操作。
整数类型(Byte、Short、Int、Long)
Scala 的整数类型就是用于存放整数值的,比如 12,30,3456 等等
- 整型分类
scala的整形默认为Int类型, 声明Long类型, 后面需要加l或者L
浮点类型(Float、Double)
Scala 的浮点类型可以表示一个小数,比如 123.4f,7.8,0.12 等等
- 浮点型分类
scala的浮点类型常量默认为Double类型, 声明Float类型常量, 需要后面加f或者F
字符类型(Char)
通常是’’括起来的单个字符
\\ 表示 \
\" 表示 "
布尔类型: Boolean
- 布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
-
Unit类型、Null类型和Nothing类型
Unit 类型用来标识过程,也就是没有明确返回值的函数。
由此可见,Unit 类似于 Java 里的 void。Unit 只有一个实例——(),这个实例也没有实 质意义
Null 类只有一个实例对象,Null 类似于 Java 中的 null 引用。Null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方 法不会正常返回,而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容
def main(args: Array[String]): Unit = {
def test(): Nothing = {
throw new Exception()
}
test()
}
自动转换
当 Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这 个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:
自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成 精度大的那种数据类型,然后再进行计算。
- 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动 类型转换。
- (byte,short)和 char 之间不会相互自动转换。
byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
强制转换
自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上 强制转函数,但可能造成精度降低或溢出,格外要注意。
var num: Int = 2.7.toInt
数值类型和String类型间转换
在程序开发中,我们经常需要将基本数值类型转成 String 类型。或者将 String 类型转成 基本数值类型。
基本类型转 String 类型(语法:将基本类型的值+”” 即可)
- String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort) ```scala // 1. 基本类型转string类型, 将基本类型值 + “” var str1: String = true + “”
//2. string转基本类型 var n1 : Byte = str1.toByte var n2 : Short = str1.toShort var n3 : Int = str1.toInt var n4 : Long = str1.toLong
**注意**<br />在将 String 类型转成基本数值类型时,要确保 String 类型能够转成有效的数据,比如我 们可以把"123",转成一个整数,但是不能把"hello"转成一个整数。
```scala
# 会出现 NumberFormatException 异常。
var n5: Int="12.6".toInt