0Pricing
Scala for Backend Engineering & Functional Programming · 课时

类型推断

让编译器推断类型。

类型推断 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

什么是类型推断

Scala 是静态类型语言,但您很少需要明确写出类型。编译器会根据右侧的值推断类型。

这样既获得了类型带来的安全性,又保持了动态语言般的简洁。

val n = 42        // inferred Int
val label = "hi" // inferred String

从字面量推断类型

当您编写 val x = 5 时,编译器会看到 Int 字面量,并将 x 的类型设为 Int。

小数字面量会成为 Double,带引号的文本会成为 String。

object Main extends App {
  val count = 5
  val ratio = 1.5
  println(count + ratio)
}

推断函数返回类型

编译器还可以根据方法主体推断方法的返回类型。

这里 square 返回 Int,因为主体将两个 Int 值相乘。您不必明确声明它。

object Main extends App {
  def square(x: Int) = x * x
  println(square(6))
}

参数仍然需要类型

类型推断有其限制。方法参数必须添加注解,因为编译器没有可用于推断它们的信息。

如果不在 x 上添加 : Int,下面的代码片段将无法编译。

def increment(x: Int) = x + 1 // type on x is required

推断出的公共类型

当值可能属于多种类型时,Scala 会推断出最具体的公共类型。

在算术运算中混合 Int 和 Double,会将结果扩大为 Double。

object Main extends App {
  val mixed = 3 + 2.0  // Double
  println(mixed)
}

集合中的类型推断

集合会根据您放入其中的值推断元素类型。

整数列表会自动成为 List[Int],因此无需添加注解也能保持完整的类型安全。

object Main extends App {
  val nums = List(1, 2, 3) // List[Int]
  println(nums.sum)
}

类型推断带来意外时

有时推断出的类型会比您想要的更宽。包含不同数字的列表可能会被推断为 List[Double],甚至 List[AnyVal]。

如果推断出的类型不符合需求,请添加显式注解。

val a = List(1, 2.0)        // List[Double]
val b = List(1, "two")     // List[Any]

使用注解覆盖推断结果

您始终可以明确指定类型。类型注解既能记录您的意图,也能覆盖过于狭窄的推断结果。

这里特意将字面量 7 扩大为 Long。

val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)

公共 API:明确指定类型

一种常见的代码风格规则是:让类型推断处理局部 val,但为公共方法明确写出返回类型。

这样即使实现发生变化,库的契约也能保持稳定。

def total(items: List[Int]): Int = items.sum

类型推断仍能保持类型安全

类型推断不会削弱类型系统。编译器仍会拒绝无效操作。

下面的 name 被推断为 String,因此将它与数字相乘会导致编译失败,这正是应有的行为。

val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense

推断出的 val 仍然不可变

类型推断只负责补充类型,不会改变绑定是否可变。

val n = 10 仍然是不可变的,并且类型固定为 Int;编译器只是替您省去了输入 : Int 的步骤。

object Main extends App {
  val n = 10 // inferred Int, still a val
  println(n * n)
}

快速检查

Scala 在哪些情况下仍要求您写出类型?

回顾

类型推断让 Scala 在保持简洁的同时,不会失去静态安全性。

  • 局部 val 和返回类型通常会自动推断。
  • 方法参数必须添加类型注解。
  • 推断会选择最具体的公共类型。
  • 对于公共 API,或需要覆盖令人意外的推断结果时,请显式添加类型注解。

常见问题解答

「类型推断」课时是免费的吗?

是的 — 「类型推断」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

「类型推断」这节课中我会学到什么?

让编译器推断类型。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「类型推断」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. val 与 var
  2. 基本类型和字面量
  3. 类型推断
  4. 以表达式为主,而非语句
← 返回 Scala for Backend Engineering & Functional Programming