为什么可选择输入Dart?

时间:2011-11-17 14:51:52

标签: generics covariance dart type-systems

http://www.dartlang.org/docs/spec/dartLangSpec.pdf

下面提到Dart的语言规范

  

Dart支持基于接口类型的可选输入。   由于泛型类型的协方差,类型系统不健全,。这是   刻意的选择(毫无疑问是有争议的)。经验表明   泛型的声音类型规则在程序员直觉面前飞行。它是......

  • 有人可以进一步详细说明类型系统不健全的原因吗?
  • Dart lang规范编写者在他们说仿制品的声音类型规则在直觉面前飞行时会想到什么?

3 个答案:

答案 0 :(得分:9)

来自Gilad Bracha [1]:

  

你可以写一个工具来尖叫血腥谋杀这些   事情,但你不能做的是阻止人们运行他们的   程序

或者,换句话说,[2]:

  

在   问题是完全和明确地表达类型流更多   对于大多数程序员来说,比编写传递值的代码更难   周围并处理运行时类型错误,如果它们发生的话。该   选择这种难度差异的词是后者   比前者更“直观” - 我认为这不是特别的   不好的选择。这种现象是最大的原因之一   动态语言近年来变得越来越受欢迎了   拒绝指定静态类型的复杂性。

     

就像那样   另一个三角形权衡:表达,声音,简单:选择任意两个   为您的类型系统。几乎每个人都不愿意放弃   表现力 - 现代软件中编织的对象图可以是   确实非常纠结 - 而任何希望拥有的语言   大规模的成功不能只是相当简单。   所以他们放弃了一些(静态类型)健全性,并且   在调试和测试期间会遇到很多运行时类型错误。

[1] http://blog.sethladd.com/2011/11/transcription-of-quick-tour-of-dart-by.html

[2] http://lambda-the-ultimate.org/node/4377#comment-67589

答案 1 :(得分:8)

  

Dart lang规范编写者在他们说仿制品的声音类型规则在直觉面前飞行时会想到什么?

看一下这个问题的相关问题。我明白了:

  • 为什么List<Number>不是List<Object>的子类型?
  • 为什么通用接口默认不是共同/逆变?
  • 为什么我无法将List<Derived>分配给List<Base>
  • 为什么我不能从list<MyClass>投射到List<object>
  • 为什么Animals[] animals = new Cat[5]会编译,但List<Animal> animals = new List<Cat>()却没有?

虽然协方差不合适(对于许多可变类型),但许多程序员在第一次开始使用泛型类型时会直观地预期这种行为。

答案 2 :(得分:2)

更具体地说,就不健全而言,泛型类型是协变的。因此,字符串列表可以传递给需要List of Object的东西。这不是类型安全的,因为期望Object列表的东西可以想象地尝试向List添加一些不是String的东西。但是告诉人们当你将B作为A的子类时,但是收集&lt; B&gt;不是Collection&lt; A&gt;的子类型。是非常不直观的。