2009-03-06 2 views

答えて

16

タイプパラメータが「出力」位置でのみ使用されるため、それらのいずれかを取得したときにできることに関しては、実際の違いはありません。一方で、として使用することができる点で大きな違いがあります。

Enumeration<JarEntry>があるとします。Enumeration<ZipEntry>を引数の1つとするメソッドに渡すことはできませんでした。 となりますが、方法はEnumeration<? extends ZipEntry>となります。

入力位置と出力位置の両方でタイプパラメータを使用するタイプがあると、より面白いでしょう - List<T>が最も明白な例です。ここでは、パラメータのバリエーションを持つメソッドの3つの例を示します。いずれの場合も、リストからアイテムを取得し、別のアイテムを追加しようとします。

// Very strict - only a genuine List<T> will do 
public void Foo(List<T> list) 
{ 
    T element = list.get(0); // Valid 
    list.add(element); // Valid 
} 

// Lax in one way: allows any List that's a List of a type 
// derived from T. 
public void Foo(List<? extends T> list) 
{ 
    T element = list.get(0); // Valid 
    // Invalid - this could be a list of a different type. 
    // We don't want to add an Object to a List<String> 
    list.add(element); 
} 

// Lax in the other way: allows any List that's a List of a type 
// upwards in T's inheritance hierarchy 
public void Foo(List<? super T> list) 
{ 
    // Invalid - we could be asking a List<Object> for a String. 
    T element = list.get(0); 
    // Valid (assuming we get the element from somewhere) 
    // the list must accept a new element of type T 
    list.add(element); 
} 

詳しくは、読み取り:

+0

ZipEntrySubclassはJarEntry(ZipFile.entriesがワイルドカードを使用する理由)のようですか? –

+0

ありがとうTom - 私の答えを編集します:) –

4

はい、直sun generics tutorialsのいずれかから:

ここでShapeは、円、矩形、 、Triangleの3つのサブクラス を持つ抽象クラスです。

public void draw(List<Shape> shape) { 
    for(Shape s: shape) { 
    s.draw(this); 
    } 
} 

それは引き分け() メソッドのみ 形状のリストに呼び出すことができるし、リスト上で呼び出すことができないことは注目に値する 例えば円、矩形、三角形の 。

public void draw(List<? extends Shape> shape) { 
    // rest of the code is the same 
} 
+0

今週はJon Skeetが私の直前に答えを出したのは今回が2回目です。私はこれをSkeetingと呼ぶことを提案する。 – GaryF

+0

音が良い。過去時制はどうなるの?スケート? "Jon Skeet sket me again!" :) – Epaga

+0

http://stackoverflow.com/questions/305223/jon-skeet-facts/317486#317486 –

0

を今、あなたはちょうど行って、私たちはC#の世界ではオーバーよかった何かを思い出させました:メソッドは、形状のいずれかの種類を受け入れる 有するためには、次のように書かれて する必要があります。 Logic and its application to Collections.Generic and inheritance

その選択されている:

関連する問題