有没有实现泛型_well_的语言?

时间:2020-03-05 18:49:44  来源:igfitidea点击:

我喜欢"泛型的差异"中的讨论,并且想知道是否有任何语言使用此功能特别好。

我真的不喜欢Java的`List <?扩展了Foo>的列表,将Liskov可以替换为Foo的东西列出。为什么" List <Foo>"不能覆盖?

老实说,可比&lt;?超级酒吧>

我也记不住我一生中为什么不应该返回泛型数组的原因:

public T[] getAll<T>() { ... }

我从不喜欢C ++中的模板,但这主要是因为没有一个编译器会向他们发出远程有意义的错误消息。我有一次实际上做了17次" make realclean && make"来进行编译。我从来没有弄清楚为什么第17次如此具有魅力。

那么,谁真的喜欢在他们的宠物语言中使用泛型?

解决方案

回答

Haskell很好地实现了类型构造函数的参数化(泛型或者参数多态性)。 Scala也是如此(尽管有时需要一些手动操作)。

这两种语言都具有更高种类的类型(也称为抽象类型构造函数,或者类型构造函数多态性,或者高阶多态性)。

参见此处:高级泛型

回答

哎呀,英语甚至不能很好地实现泛型。 :)

我的偏见是针对C#。主要是因为这是我当前正在使用的,并且我已经使用它们取得了良好的效果。

回答

我使用.Net(VB.Net),使用泛型没有任何问题。这几乎没有痛苦。

Dim Cars as List(Of Car)
Dim Car as Car

For Each Car in Cars
...
Next

使用泛型集合从来没有任何问题,尽管我到目前为止还没有自己设计任何使用泛型的对象。

回答

我认为Java中的泛型实际上相当不错。为什么List <Foo>与List <不同?对Foo>的扩展是,当Foo是Bar的子类型时,List <Foo>不是List <Bar>的子类型。如果可以将" List <Foo>"对象视为" List <Bar>",则可以向其中添加" Bar"对象,这可能会破坏事情。任何合理的类型系统都需要这样做。 Java使我们可以将Foo []视为Bar []的子类型,但这会强制执行运行时检查,从而降低性能。当我们返回这样的数组时,这使编译器很难知道是否进行运行时检查。

我从来不需要使用下限(" List <?super Foo>"),但我想它们可能对返回通用值有用。参见协方差和逆方差。

总的来说,我绝对同意有关语法过于冗长和错误消息令人困惑的抱怨。具有类型推断的语言(例如OCaml和Haskell)可能会使我们更轻松,尽管它们的错误消息也可能使我们感到困惑。

回答

我将OCaml添加到列表中,它具有真正的泛型泛型。我同意Haskell的类型类确实做得很好,但这有点不同,因为Haskell没有OO语义,但是OCaml确实支持OO。

回答

我认为Cand VB.NET在泛型方面做得很好。