2008-09-08 9 views
7

私はDifferences in Genericsというディスカッションが好きで、特にこの機能を使用した言語があるかどうかは疑問でした。generics _well_を実装する言語はありますか?

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

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

私はまた、あなたがジェネリック医薬品の配列を返すことは決してありません私の理由の人生のために覚えていないことができます。

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

私はC++でテンプレートを言っていませんが、コンパイラのどれもが今まで可能性があるため、それがほとんどでしたそれらのために遠隔に意味のあるエラーメッセージを吐き出す。私は実際にコンパイルするために何かを得るために17回、make realclean && makeを実際に行った。私は17回目がなぜ魅力的だったのか決して理解しませんでした。

だから実際にはのペット用ジェネリックを使用していますか?

+0

コミュニティWikiにする必要があります。 –

+0

私にはいい音です:) –

答えて

14

ハスケルは型コンストラクタのパラメータ化(ジェネリックまたはパラメトリック多型)を非常にうまく実装しています。 Scalaもそうですが(時には少々の手持ちが必要です)。

これらの言語はいずれも、より高級な型(抽象型のコンストラクタ、型生成の多型、高次の多型など)を持っています。

はこちらをご覧ください:Generics of a Higher Kind

7

ヘックは、英語さえもジェネリックを実装していません。 :)

私のバイアスはC#です。主にそれは私が現在使っているものであり、私はそれを良い結果に使用しているからです。

1

私は.NET(VB.Net)を使用しており、ジェネリックの使用に問題はありませんでした。それはほとんど無痛です。私はこれまで自分でジェネリック医薬品を使用するすべてのオブジェクトを設計することとして行っていないものの、

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

For Each Car in Cars 
... 
Next 

は、ジェネリックコレクションを使用して任意の問題を抱えていたことはありません。

7

私はJavaのジェネリックスが実際にはかなり良いと思います。 List<Foo>List<? extends Foo>と異なる理由は、FooBarのサブタイプである場合、List<Foo>List<Bar>のサブタイプではありません。 List<Foo>オブジェクトをList<Bar>として扱うことができる場合は、Barオブジェクトを追加してオブジェクトを破損する可能性があります。どんな合理的なタイプのシステムでもこれが必要です。 Javaでは、Foo[]をサブタイプBar[]として扱うことができますが、実行時のチェックが強制され、パフォーマンスが低下します。このような配列を返すと、コンパイラはランタイムチェックを行うかどうかを知ることが難しくなります。

私は下限(List<? super Foo>)を使う必要は一度もありませんが、一般的な値を返すのに便利だと思います。 covariance and contravarianceを参照してください。

しかし、全体的には、過度に冗長な構文と紛らわしいエラーメッセージに関する苦情にはっきりと同意します。OCamlやHaskellのような型推論を持つ言語は、エラーメッセージが混乱する可能性はあるものの、これをより簡単にするでしょう。

+0

私はほとんどあなたに同意しますが、タイプ消しゴムには時々痛みがあり、ジェネリックでプリミティブ型を使用することはできません。 –

3

私はリストにOCamlを追加します。これは実際にはという汎用名ジェネリックです。私は、Haskellの型クラスが本当にうまくいっていることに同意しますが、HaskellにはOOセマンティクスはありませんが、OCamlはOOをサポートしています。

0

C#とVB.NETはジェネリックでうまくいくと思います。

関連する問題