类型推断
让编译器推断类型。
类型推断 是 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 反馈 — 无需本地设置。