Dart面试题更新 2026-08-05

请说明 Dart 支持哪些数据类型,并解释 dynamic 与 Object 在类型系统和运行时的区别。

技术原理Dart

考察说明

考察对 Dart 类型体系的掌握程度,特别是 dynamic 与 Object 这两个特殊类型的语义差异。

回答思路

  1. 【回答框架 1】Dart 是强类型语言,但支持类型推断。数据类型主要分为基本类型(如 int、double、String、bool)、集合类型(List、Set、Map)、以及特殊类型(null、dynamic、Object、Never、void)。
  2. 【回答框架 2】Object 是所有非空类型的基类,任何类的实例都可以赋值给 Object 类型变量,但它只暴露 Object 类自身定义的成员(如 toString、hashCode、runtimeType)。编译时类型检查会基于该静态类型进行。
  3. 【回答框架 3】dynamic 则关闭了静态类型检查,编译器允许对该类型的变量调用任意方法或访问任意属性,运行时才会进行实际查找。若调用不存在的方法,会在运行时报错。
  4. 【回答框架 4】关键区别:Object 是静态类型,编译期保留类型信息;dynamic 是动态类型,编译期不做检查。例如:dynamic a = 1; a.foo(); 编译可通过,但运行时报错;而 Object b = 1; b.foo(); 编译时就会报错。
  5. 【回答框架 5】在 Dart 中,dynamic 与 Object 均可接收任意类型值,但 dynamic 更灵活,适合与动态语言交互(如 json 解析),但增加了运行时风险;Object 更安全,适合需要明确基类类型的场景。
  6. 【关键点 1】Dart 数据类型包括基本类型、集合类型和特殊类型。
  7. 【关键点 2】Object 是所有类的基类,提供有限的公共接口,编译时类型检查严格。
  8. 【关键点 3】dynamic 变量可以调用任意方法,编译不报错,但错误在运行时暴露。
  9. 【关键点 4】dynamic 与 Object 的核心差异在于静态类型检查的行为。
  10. 【易错点 1】面试时容易混淆 dynamic 和 Object 的检查时机:dynamic 是编译期不检查,运行期检查;Object 是编译期就按静态类型检查。
  11. 【易错点 2】注意不要误以为 Object 能调用任意方法,实际上只能调用 Object 类定义的方法,除非进行显式类型转换。