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

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

老实说, Comparable<? super Bar>?

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

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

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

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

有帮助吗?

解决方案

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

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

看这里: 高级泛型

其他提示

我认为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 这样具有类型推断的语言可能会让你更容易做到这一点,尽管它们的错误消息也可能令人困惑。

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

我偏向于 C#。主要是因为这就是我目前正在使用的,而且我用过效果很好。

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

我使用.Net (VB.Net),并且在使用泛型时没有遇到任何问题。大部分都是无痛的。

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

For Each Car in Cars
...
Next

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top