是否有任何语言实现泛型_well_?

Jam*_*sen 7 language-agnostic generics

我喜欢在泛型中的差异讨论,并且想知道是否有任何语言特别好地使用了这个功能.

我真的不喜欢Java的List<? extends Foo>一个List事情是里氏可替代性的Foo.为什么不能List<Foo>涵盖那个?

老实说,Comparable<? super Bar>

我也记不起为什么你永远不会返回一系列泛型:

public T[] getAll<T>() { ... }
Run Code Online (Sandbox Code Playgroud)

我从来不喜欢C++中的模板,但这主要是因为没有一个编译器会为它们吐出一个远程有意义的错误消息.有一次我实际上做了make realclean && make17次才能得到一些东西来编译; 我从未弄清楚为什么第17次是魅力.

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

Apo*_*isp 14

Haskell很好地实现了类型构造函数参数化(泛型或参数多态).Scala也是如此(虽然有时需要一些手持).

这两种语言都有更高级的类型(也就是抽象类型构造函数,或类型构造函数多态,或更高阶多态).

请参阅此处:更高级别的泛型


Cra*_*aig 7

哎呀,英语甚至没有很好地实现泛型.:)

我的偏见是C#.主要是因为这是我目前正在使用的,我已经使用它们取得了良好的效果.


Jay*_*rod 7

我认为Java中的泛型实际上非常好.之所以List<Foo>不同,List<? extends Foo>是因为什么时候Foo是子类型Bar,List<Foo>不是子类型List<Bar>.如果你可以将List<Foo>对象视为一个对象List<Bar>,那么你可以Bar向它添加对象,这可能会破坏对象.任何合理的类型系统都需要这个.Java可以让您Foo[]作为子类型处理Bar[],但这会强制运行时检查,从而降低性能.返回此类数组时,编译器很难知道是否要进行运行时检查.

我从来不需要使用下界(List<? super Foo>),但我认为它们可能对返回泛型值很有用.参见协方差和逆变.

总的来说,我绝对同意有关过于冗长的语法和令人困惑的错误消息的抱怨.像OCaml和Haskell这样的类型推断语言可能会让你更容易,尽管他们的错误信息也会让人感到困惑.