Dart编辑器版本1.2.0.release(STABLE).Dart SDK 1.2.0版.
此源代码生成运行时异常.
void main() {
test(new Base());
}
void test(Child child) {
}
class Base {
}
class Child extends Base {
}
我假设分析仪生成这样的东西.
The argument type 'Base' cannot be assigned to the parameter type 'Child'
但是我只能在发生此异常(post factum)时在运行时检测到此错误.
Unhandled exception: type 'Base' is not a subtype of type 'Child' of 'child'.
lrn.. 6
分析仪遵循此处的语言规范.
它仅警告参数表达式的静态类型是否不能赋值给参数的函数类型.
在Dart中,如果任一类型是另一种类型的子类型,则一种类型的表达式可分配给另一种类型的变量.
这不是一种安全的类型检查.它找不到所有可能的错误.另一方面,它也不会禁止一些正确的用途,例如:
Base foo = new Child();
void action(Child c) { ... }
action(foo); // Perfectly correct code at runtime.
其他语言有安全的分配检查,但它们也阻止了一些正确的程序.然后,您必须添加(不安全/运行时检查)强制转换操作符,以告诉编译器您知道该程序是安全的.这是Dart选择宽容并避免大多数演员阵容的权衡.