Dart:动态对象与可为 null 的对象

Ano*_*ous 0 nullable dynamic object dart

dynamic飞镖和Object?飞镖有什么区别吗?

这个问题听起来可能与What is the Difference betweendynamic and Object in dart?重复。。然而,我认为并非如此。我不是在谈论语义差异或 dart 分析器抛出的任何警告,或从编码员的角度来看的任何内容。我想知道两者之间是否存在真正的区别。

我可以为两者分配任何数据值。

当我运行以下命令时:

Object? a;
dynamic b;
print(a.runtimeType);
print(b.runtimeType);
Run Code Online (Sandbox Code Playgroud)

我得到:

Null
Null
Run Code Online (Sandbox Code Playgroud)

我知道dynamic是一个关键字,而Object?是一个对象类。但确实dynamic推断Object?.

我是 Dart lang 的新手。所以,请赐教。

lrn*_*lrn 5

是,有一点不同。

类型dynamicObject?是等效的。子类型化。两者都是“顶级类型”,这意味着每种类型都是它们的子类型,甚至是彼此的子类型。因此,对于子类型来说没有区别。

区别完全在于您可以使用具有这些类型之一的表达式执行哪些操作。

如果表达式具有类型,那么您可以调用它的唯一方法是和Object?的方法。您可以将表达式分配给的唯一类型是顶级类型。ObjectNull

如果表达式的类型为dynamic,则就好像静态类型系统已被关闭。您可以dynamicExpression.arglebargle()在没有任何警告的情况下调用任何方法(例如 )。如果该方法在运行时不存在,则会抛出错误。并且您可以将值分配给任何类型。如果该值在运行时不具有该类型,则会抛出错误。(这通常称为“隐式向下转型”,因为它的工作方式就好像is ExpectedType编译器将 an 添加到表达式中一样。)此外,由于表达式被视为dynamic具有任何方法,因此您无法对其调用扩展方法。

它就像是dynamic一个类型别名,Object?具有关闭静态类型检查的额外效果。