人们普遍认为Java泛型在某些重要方面失败了。通配符和范围的组合导致了一些严重无法读取的代码。
但是,当我看其他语言时,似乎真的找不到程序员满意的通用类型系统。
如果我们将以下作为此类类型系统的设计目标:
- 总是产生易于阅读的类型声明
- 易于学习(无需复数协方差,逆方差等)
- 最大化编译时错误的数量
有没有正确的语言?如果我使用google,我唯一看到的就是对类型系统如何吸收X语言的抱怨。这种类型的复杂性是通用类型固有的吗?我们应该放弃在编译时尝试100%验证类型安全性的想法吗?
我的主要问题是,就这三个目标而言,哪种语言“做到最好”是最好的。我意识到这是主观的,但到目前为止,我什至找不到一种语言,并非所有程序员都同意通用类型系统是一团糟。
附录:如前所述,子类型/继承和泛型的结合才是造成复杂性的原因,所以我真的在寻找一种将两者结合起来并避免复杂性激增的语言。
Foo<T> where SiameseCat:T
),并且不可能有不可转换为的泛型类型Object
。恕我直言,.NET将从类似于结构的聚合类型中受益,但更多的是无约束的。如果KeyValuePair<TKey,TValue>
是这样的类型,则IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
可以将强制转换为IEnumerable<KeyValuePair<Animal,Vehicle>>
,但前提是不能将该类型装箱。
easy-to-read type declarations
?第三个条件也是模棱两可的:例如,除非我可以在编译时计算索引,否则不让你索引数组,可以将数组索引超出范围的异常转化为编译时错误。同样,第二个标准排除了子类型化。这不一定是一件坏事,但您应该知道自己的要求。