类型转换 #
一、数值类型转换 #
1.1 自动类型转换(隐式转换) #
从小类型到大类型自动转换:
scala
val byteVal: Byte = 10
val shortVal: Short = byteVal
val intVal: Int = shortVal
val longVal: Long = intVal
val floatVal: Float = longVal
val doubleVal: Double = floatVal
1.2 转换方向 #
text
Byte → Short → Int → Long → Float → Double
↓
Char
1.3 表达式中的自动转换 #
scala
val a: Byte = 10
val b: Short = 20
val sum = a + b
val c: Int = 100
val d: Long = 200L
val result = c + d
二、强制类型转换 #
2.1 使用 toXxx 方法 #
scala
val doubleVal = 3.14159
val intVal = doubleVal.toInt
val longVal = doubleVal.toLong
val floatVal = doubleVal.toFloat
val longNum = 100L
val intNum = longNum.toInt
val shortNum = longNum.toShort
val byteNum = longNum.toByte
2.2 精度丢失 #
scala
val largeLong = 9223372036854775807L
val intVal = largeLong.toInt
println(intVal)
val doubleVal = 3.99
val intVal2 = doubleVal.toInt
println(intVal2)
2.3 字符与数值转换 #
scala
val charA = 'A'
val intVal = charA.toInt
val intVal2 = 65
val charVal = intVal2.toChar
三、字符串与数值转换 #
3.1 数值转字符串 #
scala
val num = 42
val str1 = num.toString
val str2 = s"$num"
val str3 = f"$num"
3.2 字符串转数值 #
scala
val intStr = "123"
val intVal = intStr.toInt
val longStr = "123456789012345"
val longVal = longStr.toLong
val doubleStr = "3.14159"
val doubleVal = doubleStr.toDouble
val floatStr = "3.14f"
val floatVal = floatStr.toFloat
val boolStr = "true"
val boolVal = boolStr.toBoolean
3.3 安全转换 #
使用 toIntOption 等方法避免异常:
scala
val maybeInt = "123".toIntOption
val invalid = "abc".toIntOption
maybeInt match
case Some(n) => println(s"Number: $n")
case None => println("Invalid number")
val result = "123".toIntOption.getOrElse(0)
3.4 处理转换异常 #
scala
def safeToInt(str: String): Option[Int] =
try
Some(str.toInt)
catch
case _: NumberFormatException => None
safeToInt("123")
safeToInt("abc")
四、引用类型转换 #
4.1 asInstanceOf #
scala
val x: Any = "Hello"
val str = x.asInstanceOf[String]
val y: Any = 42
val num = y.asInstanceOf[Int]
4.2 不安全的转换 #
scala
val x: Any = "Hello"
val num = x.asInstanceOf[Int]
4.3 使用模式匹配(推荐) #
scala
val x: Any = "Hello"
val result = x match
case s: String => s"String: $s"
case i: Int => s"Int: $i"
case d: Double => s"Double: $d"
case _ => "Unknown type"
4.4 isInstanceOf 检查 #
scala
val x: Any = 42
if x.isInstanceOf[Int] then
val num = x.asInstanceOf[Int]
println(s"Number: $num")
五、类型强制转换规则 #
5.1 数值类型转换表 #
| 从\到 | Byte | Short | Char | Int | Long | Float | Double |
|---|---|---|---|---|---|---|---|
| Byte | - | 自动 | toChar | 自动 | 自动 | 自动 | 自动 |
| Short | toByte | - | toChar | 自动 | 自动 | 自动 | 自动 |
| Char | toByte | toShort | - | 自动 | 自动 | 自动 | 自动 |
| Int | toByte | toShort | toChar | - | 自动 | 自动 | 自动 |
| Long | toByte | toShort | toChar | toInt | - | 自动 | 自动 |
| Float | toByte | toShort | toChar | toInt | toLong | - | 自动 |
| Double | toByte | toShort | toChar | toInt | toLong | toFloat | - |
5.2 溢出处理 #
scala
val maxInt = Int.MaxValue
val overflow = maxInt + 1
println(s"Overflow: $overflow")
val safeAdd = Math.addExact(maxInt, 1)
六、隐式转换 #
6.1 预定义隐式转换 #
Scala 自动应用一些预定义的隐式转换:
scala
val str: String = "Hello"
val ops: scala.collection.StringOps = str
val intVal: Int = 42
val richInt: scala.runtime.RichInt = intVal
6.2 自定义隐式转换 #
scala
implicit class StringExtensions(val s: String) extends AnyVal:
def greet: String = s"Hello, $s!"
val name = "Scala"
println(name.greet)
6.3 隐式转换规则 #
隐式转换在以下情况自动应用:
- 表达式类型与期望类型不匹配
- 访问对象不存在的成员
- 调用方法时参数类型不匹配
七、类型转换最佳实践 #
7.1 使用安全的转换方法 #
scala
val input = "123"
val result1 = input.toIntOption.getOrElse(0)
val result2 = scala.util.Try(input.toInt).getOrElse(0)
7.2 使用模式匹配 #
scala
def process(value: Any): String = value match
case s: String => s"String: $s"
case i: Int => s"Int: $i"
case d: Double => s"Double: $d"
case b: Boolean => s"Boolean: $b"
case _ => s"Unknown: $value"
7.3 避免 asInstanceOf #
scala
val x: Any = "Hello"
val result = x match
case s: String => s.toUpperCase
case _ => ""
7.4 处理可能的失败 #
scala
def parseNumber(str: String): Either[String, Int] =
str.toIntOption match
case Some(n) => Right(n)
case None => Left(s"Cannot parse '$str' as Int")
parseNumber("123")
parseNumber("abc")
八、常见陷阱 #
8.1 精度丢失 #
scala
val largeLong = 123456789012345L
val intVal = largeLong.toInt
println(intVal)
val doubleVal = 3.99
val truncated = doubleVal.toInt
println(truncated)
8.2 溢出 #
scala
val maxInt = Int.MaxValue
val overflow = maxInt + 1
println(overflow)
val checked = Math.addExact(maxInt, 1)
8.3 null 转换 #
scala
val nullStr: String = null
val upper = nullStr.toUpperCase
val safeUpper = Option(nullStr).map(_.toUpperCase).orNull
8.4 字符串解析异常 #
scala
val invalid = "abc".toInt
val safe = scala.util.Try("abc".toInt).getOrElse(0)
九、实用工具方法 #
9.1 数值范围检查 #
scala
def safeByteValue(l: Long): Option[Byte] =
if l >= Byte.MinValue && l <= Byte.MaxValue then
Some(l.toByte)
else
None
safeByteValue(100)
safeByteValue(1000)
9.2 安全的数值运算 #
scala
def safeAdd(a: Int, b: Int): Option[Int] =
val result = a.toLong + b.toLong
if result >= Int.MinValue && result <= Int.MaxValue then
Some(result.toInt)
else
None
safeAdd(Int.MaxValue, 1)
safeAdd(100, 200)
9.3 类型转换工具类 #
scala
object TypeConverter:
def toIntSafely(value: Any): Option[Int] = value match
case i: Int => Some(i)
case l: Long => if l >= Int.MinValue && l <= Int.MaxValue then Some(l.toInt) else None
case d: Double => Some(d.toInt)
case s: String => s.toIntOption
case _ => None
TypeConverter.toIntSafely(42)
TypeConverter.toIntSafely(42L)
TypeConverter.toIntSafely("42")
TypeConverter.toIntSafely("abc")
十、总结 #
转换方法对比 #
| 方法 | 安全性 | 适用场景 |
|---|---|---|
| toInt/toLong 等 | 不安全(可能抛异常) | 确定安全的转换 |
| toIntOption 等 | 安全 | 字符串解析 |
| asInstanceOf | 不安全 | 类型已知 |
| 模式匹配 | 安全 | 类型不确定 |
| 隐式转换 | 安全 | 扩展功能 |
最佳实践 #
- 优先使用安全的转换方法(toXxxOption)
- 使用模式匹配代替 asInstanceOf
- 处理可能的异常情况
- 注意数值溢出和精度丢失
下一步,让我们学习 字符串!
最后更新:2026-03-27