8

如果我有一个返回未知类型值的函数,我是使用dynamic, 表示任何对象,还是使用Object,它是所有其他类型的祖先?

样式指南针对参数讨论了这个问题,而不是针对返回值。

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

4

1 回答 1

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.

于 2013-04-12T20:59:34.113 回答