7

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

我真的不喜欢 Java 的一些可以 Liskov 替代的List<? extends Foo>东西。为什么不能覆盖?ListFooList<Foo>

老实说,Comparable<? super Bar>

我也记不起为什么你永远不应该返回泛型数组:

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

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

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

4

6 回答 6

14

Haskell 很好地实现了类型构造函数参数化(泛型或参数多态)。Scala 也是如此(尽管有时它需要一些帮助)。

这两种语言都有更高种类的类型(又名抽象类型构造函数,或类型构造函数多态性,或高阶多态性)。

见这里:更高种类的泛型

于 2008-09-09T00:02:12.603 回答
7

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

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

于 2008-09-09T00:02:43.770 回答
7

我认为Java中的泛型实际上非常好。之所以List<Foo>不同,List<? extends Foo>是因为 whenFoo是 的子类型BarList<Foo>不是 的子类型List<Bar>。如果您可以将List<Foo>对象视为List<Bar>,那么您可以向其中添加Bar对象,这可能会破坏事物。任何合理的类型系统都需要这个。Java 允许您摆脱将Foo[]其视为 的子类型Bar[],但这会强制运行时检查,从而降低性能。当您返回这样一个数组时,这使得编译器很难知道是否进行运行时检查。

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

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

于 2008-09-09T00:36:20.197 回答
3

我会将 OCaml 添加到列表中,它具有非常通用的泛型。我同意 Haskell 的类型类确实做得很好,但有点不同的是 Haskell 没有 OO 语义,但 OCaml 确实支持 OO。

于 2008-09-09T01:05:33.713 回答
1

我使用.Net (VB.Net),使用泛型没有任何问题。它大多是无痛的。

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

For Each Car in Cars
...
Next

使用泛型集合从来没有遇到过任何问题,尽管我还没有设计任何使用泛型的对象。

于 2008-09-09T00:07:14.197 回答
0

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

于 2008-09-09T14:20:00.620 回答