2012-06-10 11 views
10

第1コードと第2コードの違いは何ですか? MaxPQは、互いに比較できる「Key」オブジェクトの集合である優先度キューを表します。は、Javaでvs extends genericsを実装しています

コード1:

public class MaxPQ<Key extends Comparable<Key>>{ 
... 
} 

コード2:

public class MaxPQ<Key implements Comparable<Key>>{ 
... 
} 

第二のコードがコンパイルされませんが、私たちが使用しているときのインターフェイスを拡張する代わりに実装する必要がある理由、それは私には直感的ではありません一般的な。

+1

[こちら] [1]に同様の質問があります。 [1]:http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed-but-not-implements-t – krakover

答えて

10

違いはかなり簡単です.2番目のコードスニペットはコンパイルされず、決して実行されません。ジェネリックでは、クラスとインターフェイスの両方に常にextendsを使用します。また、キーワードsuperも使用できますが、セマンティクスは異なります。

+0

はあなたに感謝し、そこにありますその理由? – Popcorn

+0

@ MarkX:これはジェネリック医薬品の設計と特定の方法です。シンプルさ? –

+3

@マーク一つの理由は、 'Key'はインターフェースそのものである可能性があります。そして、Comparableがインターフェースであっても突然' extends'になります。それで、すべてのケースで絶対に正しいことを得ることができないので、一貫して一貫性がないことが好まれました。 – Voo

1

ジェネリックには実装がありません。 2番目のコードは無効です。私はそれが一般的なクラス宣言の場合には、それは何の違いは、インターフェイスまたはクラスにするためにバインドタイプの引数であることを確認していないため、インタフェースとクラスの両方にextendsを使用することが決定されたと仮定し

public class MaxPQ implements Comparable<Key> { 
    ... 
} 
0

:あなたはおそらくで混乱します。

もちろん、extendsの意味は、クラス定義における典型的な使用法とはまったく異なります。 Angelika Langerは、Javaでextendsという異なる意味について素敵なテキストを持っています:Does "extends" always mean "inheritance"?

関連する問題