scala数据类型

2023-12-15 08:43:11
scala安装使用教程_一篇搞定!-CSDN博客
1.7 Scala数据类型

# Any是所有类型的父类
    它定义了一些通用的方法如equals、hashCode和toString。Any有两个直接子类:AnyVal和AnyRef。
# AnyVal是所有值类型的父类
    有9个预定义的非空的值类型分别是:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是不带任何意义的值类型,它仅有一个实例可以像这样声明:()。所有的函数必须有返回,所以说有时候Unit也是有用的返回类型。
# AnyRef是所有引用类型的父类
    AnyRef代表引用类型。所有非值类型都被定义为引用类型。在Scala中,每个用户自定义的类型都是AnyRef的子类型。如果Scala被应用在Java的运行环境中,AnyRef相当于java.lang.Object。
# Nothing是所有类型的子类
    Nothing是所有类型的子类,也是Null的子类,他没有一个具体的实例对象,常见的应用如:抛出异常、程序exit,无限循环等,返回值为Nothing类型。
    Nothing没有对象,但是可以用来定义类型。例如,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回) 。
  def get(index:Int):Int = {
 ?  if(x < 0) throw new Exception(...)  //返回值类型Nothing
 ?  else ....
  }
 ?
# Null是所有引用类型的子类
    Null只有一个实例对象null,主要用来和其他的JVM语言进行互操作,但是几乎不应该在Scala代码中使用。

Scala 与 Java有着相同的数据类型:

数据类型描述
Byte8位有符号补码整数。数值区间为 -128 到 127
Short16位有符号补码整数。数值区间为 -32768 到 32767
Int32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float32 位, IEEE 754标准的单精度浮点数
Double64 位 IEEE 754标准的双精度浮点数
Char16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String字符序列
Booleantrue或false
Unit表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Nullnull
NothingNothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
AnyAny是所有其他类的超类
AnyRefAnyRef类是Scala里所有引用类(reference class)的基类

Scala数据类型的位数,不受具体OS的影响,以保证Scala程序的可移植性。

1.7.1 值类型AnyVal

Scala和Java一样,有8种数值类型Byte、Char、Short、Int、Long、Float、Double和一个Boolean类型,和Java不同的是 ,Scala没有基本类型与包装类型之分,这些类型都是类,有自己的属性和方法。

// 相当于Java的包装类;
1.toString()
1.to(10)
1.7.1.1 整型

Byte

// 直接使用整数赋值时,会被判断为Int类型,需要定义时指定类型
var b: Byte = 2     //b为变量,2为字面量

Short

// 直接使用整数赋值时,会被判断为Int类型,需要定义时指定类型
var s: Short = -3
// 低精度可直接隐式转换为高精度
s = b // Byte->Short

Int

// 可以直接使用数字赋值
var i = 5
// 低精度可直接隐式转换为高精度
i = b // Byte->Int
i = s // Short->Int

Long

// 直接使用小数赋值时,会被判断为Int,需要在小数后添加字母L
var l = 200L
var l1: Long = 200L
// 低精度可直接隐式转换为高精度
l = b // Byte->Long
l = s // Short->Long
l = i // Int->Long
1.7.1.2 Unit
// Unit为空类型,相当于void,使用()进行初始化
var u = ()
1.7.1.3 Boolean
// 定义Boolean类型,只能为true或者false
var b1 = false
var b2: Boolean = true
1.7.2 类型转换
1.7.2.1 自动类型转换

值类型可以按照下面的方向进行转换:

val x: Long = 987654321
val y: Float = x ?// 9.8765434E8 (note that some precision is lost in this case)

当Double转为Int时,错误如下:

scala> val i:Int=10d
<console>:11: error: type mismatch;
 found ? : Double(10.0)
 required: Int
 ? ? ? val i:Int=10d
1.7.2.2 强制类型转换

Java中的强制类型转换:

int a = (int) 100.00;

scala中处理:

//toByte ? ? toChar ? ? toDouble ? toFloat ?  toInt ? ?  toLong
//toShort ?  toString
scala> val a = 19.9
a: Double = 19.9
scala> val b = a.toInt
b: Int = 19
scala> val c=a.asInstanceOf[Int] //类似Java中的强制类型转换:(int)a
c: Int = 19

Scala与Java类型检查和转换对比

ScalaJava
obj.isInstanceOf[C]obj instanceof C
obj.asInstanceOf[C](C)obj
classOf[C]C.class
1.7.2.3 数值类型和字符串类型的转换

数值类型转字符串类型

val s1 = true+""
val s2 = 3.1415+""
val s3 = 100 +""

字符串类型转数值类型

val s4 = "3.14"
s4.toDouble

小结:

低位数可以向高位数数转换。如Byte->Short

字符可以转整形或浮点型,不同长度字符应使用不同位数的整型

整型可以转浮点型,允许精度丢失。如Long->Float

代码

package com.qianfeng.scala
?
/**
* 变量必须赋值或者是使用占位符初始化
* val 变量名称[:类型] = 值 ? : 不可变 ,相当于java的final修饰
* var 变量名称[:类型] = 值 ? : 可变
* lazy val 变量名称[:类型] = 值  懒加载,必须使用val
*
* 注意:
* 1、官方推荐我们使用val
* 2、类型自动推断
*/
object Demo02_Variable {
 ?def main(args: Array[String]): Unit = {
 ? ?val a = 100
 ? ?val b:String = "abc"
 ? ?println(a)
 ? ?//修改a的值
 ? ?//a = 200  //报错:不能改变值
?
 ? ?var c = 100
 ? ?println(c)
 ? ?c = 200
 ? ?println(c)
?
 ? ?lazy val d = 1000
 ? ?println(d)
?
 ? ?//lazy var dd = 1000 ? //报错:lazy只能修饰val变量
?
 ? ?//多变量
 ? ?val (aa,cc,dd) = (1,2,"hello")
 ? ?println(aa,dd)
 ? ?val i1,i2 = 10
 ? ?println(i1,i2)
?
?
 ? ?//类型定义
 ? ?val i3 = 200L ?//定义Long类型
 ? ?var u = () ?//定义unit类型
 ? ?println(i3,u)
?
 ? ?//转换
 ? ?//val i4:Int = i3 ? //不能直接转
 ? ?val i4:Int = i3.toInt
 ? ?val i5:Double = 3.14F
 ? ?//val i6:Int = 3.14D //不能直接转
 ? ?println(i4,i5)
?
 ? ?//val b2Int = b.toInt //
 ? ?val i7 = "12"
 ? ?val i8 = i7.toInt //字符串转int
 ? ?val i9 = i8+"" ?//int转字符串
 ? ?println(i9.isInstanceOf[String])
 ? ?println(i8.isInstanceOf[Int])
  }
}
?

文章来源:https://blog.csdn.net/HYSliuliuliu/article/details/134897619
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。