在 Dart 中,如果我不知道函数返回值的类型,我是否可以用dynamic或Object注释它?

问题描述 投票:0回答:2

如果我有一个返回未知类型值的函数,我是否使用

dynamic
(代表任何对象)或
Object
(所有其他类型的祖先)?

风格指南讨论了参数的这个问题,但没有讨论返回值的问题。

我应该如何注释返回值以及为什么?

dart
2个回答
8
投票

Dart 工程师 Bob Nystrom 写道:

返回类型是这个问题的一个有趣的转折。对于参数类型,指南非常简单:

  1. 如果您使用

    Object
    作为参数类型,则表示“我的方法将安全地接受任何对象,并且仅将其用于所有对象都支持的
    toString()
    之类的内容”。

  2. 如果您使用

    dynamic
    (或不使用任何内容)作为参数类型,那么您是在说“Dart 的类型系统无法轻松表达我在这里接受的类型”或“我懒得注释”。

翻转(1)是很棘手的。对于返回类型,我想

Object
会说“在自己进行类型测试之前,最好不要调用除
toString()
或所有对象都支持的其他内容之外的任何内容”,我认为
dynamic
的意思是“我们不能轻易地调用”对此进行注释,以便你和我更好地知道我们在做什么”。

用户必须将其“转换”为他们期望看到的特定类型,以避免编译器警告并在检查模式下更早收到错误。

就其价值而言,在许多情况下,即使返回 Object,也不必进行强制转换。当您使用类型注释初始化局部变量时,Dart 允许隐式向下转型。所以你可以这样做:

Object foo() => 123;

main() {
  int x = foo(); // Implicit downcast. No type warning.
}

我想在这种情况下,我可能会这样做

dynamic
,不过。我认为这比
Object
更好地表达了“我不知道它返回什么类型,但你应该”。


0
投票

dynamic
不是一种类型。它是抑制类型检查器的指令。可以自由使用和分配。

Object?
是代表类型系统中每个可能值的类型。它可以自由分配,但任何使用都需要显式转换为所需类型。

实际问题是,如果您明确希望用户在使用返回值之前将其转换为特定类型,则应该使用

Object?
;但是,如果您认为用户比您更了解应如何处理返回类型,则可以使用
dynamic
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.