7

私はDifferencesinGenericsでの議論が好きで、この機能を特にうまく使用している言語があるかどうか疑問に思いました。

私は、リスコフの置換可能であるもののList<? extends Foo>Javaが本当に嫌いです。なぜそれをカバーできないのですか?ListFooList<Foo>

そして正直なところ、Comparable<? super Bar>

また、ジェネリックスの配列を決して返さない理由を一生思い出せません。

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

私はC++のテンプレートが好きではありませんでしたが、それは主に、リモートで意味のあるエラーメッセージを出力するコンパイラがなかったためです。ある時、私は実際にmake realclean && make何かをコンパイルするために17回実行しました。なぜ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が のサブタイプでありBar、が のサブタイプでList<Foo>はないためですList<Bar>List<Foo>オブジェクトを として扱うことができれば、それにオブジェクトをList<Bar>追加することができ、それによって問題が発生する可能性があります。Bar合理的な型システムでは、これが必要になります。Foo[]Java では をのサブタイプとして扱うことができますが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 に答える