为什么我可以将List <dynamic>分配给List <string>?</string> </dynamic>

时间:2014-05-29 18:27:32

标签: dart

我对dart的类型检查工作方式感到困惑。如图所示,将一般List<dynamic>分配给List<String>即可。这实际上意味着我可以分配该列表中的任何内容,而不仅仅是String。那是为什么?

void main() {
  List<String> a;
  a = [1];                 // pass
  a = new List<int>();     // fail
  a = 1;                   // fail
  a = new List<String>();  // pass
  a.add(1);                // fail
}

1 个答案:

答案 0 :(得分:4)

dynamic类型很特别。它真的意味着“关闭所有类型检查,我知道我在做什么”。

在您的示例中,您将List<dynamic>实例分配给List<String>变量。静态类型检查器看到:列表列表,没关系,类型参数是动态的,所以我根本不检查,程序员必须知道他在做什么。

每当您使用dynamic作为类型或类型的一部分时,您都要对正确的输入负全部责任。系统会让你做任何你想做的事。

即使没有dynamic,Dart类型系统也不是安全。这意味着您可以创建没有静态类型警告的程序,这些警告在运行时仍会因类型错误而失败。 实际上,大多数语言都存在这个问题,只要它们包含带有共变量或反变量子类型的参数化类型。或演员表。