类型转换 #

一、数值类型转换 #

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 隐式转换规则 #

隐式转换在以下情况自动应用:

  1. 表达式类型与期望类型不匹配
  2. 访问对象不存在的成员
  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 不安全 类型已知
模式匹配 安全 类型不确定
隐式转换 安全 扩展功能

最佳实践 #

  1. 优先使用安全的转换方法(toXxxOption)
  2. 使用模式匹配代替 asInstanceOf
  3. 处理可能的异常情况
  4. 注意数值溢出和精度丢失

下一步,让我们学习 字符串

最后更新:2026-03-27