2017-10-29 4 views
10

下のワイルドカードの使い方をある程度深く理解しようとしています。私は、Listの内容を別のものにコピーする汎用メソッドcopyを書こうとしています。私はこのシグネチャを思いついた:Javaジェネリックで下限の使用:?スーパーT

<T> void copy(List<T> dest, List<? extends T> src) 

私はこの署名がすべてのシナリオに対処する包括的だと思います。彼らはList<? super T> destだけではなくList<T> destを使用する理由

<T> void copy(List<? super T> dest, List<? extends T> src) 

私は理解していない。しかし、私は、Javaコレクションクラスにメソッドのシグネチャは次のようであることがわかります。署名に柔軟性はありますか?

+0

ジェネリックのHTMLを避けるため、インラインコードをバッククォートで囲むことができます。 –

答えて

1

はここに例を示します

次のスニペットは、署名<T> void copy(List<? super T> dest, List<? extends T> src)でコンパイルを渡しますが、署名<T> void copy(List<T> dest, List<? extends T> src)では動作しません:

YourClass obj = new YourClass(); 
List<HashMap<String,String>> lhm = new ArrayList<>(); 
List<Map<String,String>> lm = new ArrayList<>(); 
obj.<HashMap<String,String>>copy (lm,lhm); 
+0

上記のコードスニペットは、両方の署名でコンパイルを行います。 Eclipseでチェックしただけです。 – user496934

+0

@ user496934 Strange。また、Eclipseでこれをテストし、YourClass型のパラメータ化されたメソッド> copy(List >、List <?extends HashMap >) (List >、List >) – Eran

+1

@ user496934あなたは 'objを呼び出しましたか?> copy(lm、lhm );または 'obj.copy(lm、lhm);'? – Eran

5

は、明示的な型証人のない実用的な違いはありません。

Eranで行われたようなタイプの目撃者を特定することなく、2つの方法の間に柔軟性に違いはありません。

基本的に、Tオーバー? super Tの使用が唯一の文体の違いであるが、しかし、それは良いコードの原則の数を適用することで見ることができるように、より良い習慣です:

  • 明示的な意思:? super Tより明確にdestのタイプを示します。
  • Modularitydestがどのタイプを取ることができるかを知るには、srcのタイプ制約を調べる必要はありません。
  • Producer Extends, Consumer Super (PECS):producerパラメータ(以下「in」)はextendsを使用し、コンシューマパラメータ(以下「out」)はsuperキーワードを使用する必要があります。 ? super Tを使用して

も(彼らもcopy機能を使用)Java tutorialsによって推奨されています

この議論の目的のためには、二つの機能の一つを提供するものとして変数を考えると便利です。

"In"変数
"in"変数はコードにデータを提供します。 2つの引数:copy(src, dest)を持つcopyメソッドを想像してみてください。 src引数はコピーするデータを提供するため、 "in"パラメータです。 "アウト" 変数
アン "アウト"

Anが変数は、他の場所で使用するためのデータを保持しています。 copyの例では、copy(src, dest)dest引数はデータを受け入れるため、 "out"パラメータです。

ワイルドカードを使用するかどうか、ワイルドカードの種類が適切かどうかを判断する際には、「内」と「外」の原則を使用できます。以下のリストは、従うべきガイドラインを提供します。

ワイルドカードガイドライン:

  • 変数「の」アンは extendsキーワードを使用して、上部の有界ワイルドカードで定義されています。
  • "out"変数は、superキーワードを使用して、下限が のワイルドカードで定義されています。
+0

この質問は[こちらにも回答しています](https://stackoverflow.com/questions/34985220/differences-between-copylist-super-t-dest-list-extends-t-src-and-co)。私はそれらが同等であるすべてのケースを示す例が特に説得力があると思います。 (賞金のために詐欺になることはできません) – River

+0

@River:それに答えるのではなく、詐欺であることを説明するmodフラグでこれをフラグするほうがいいでしょう。 – Makoto

+0

@Makotoは少し後で複製を見つけました – River

関連する問題