2011-07-02 15 views
0

ブリッジメソッドになると、(もしmughalとangelikalangerのウェブサイトでSCJPを読んだ後で)サブクラスによってオーバーライドが適切に行われるようにするには、Javaコンパイラがそれらを追加することがわかります。しかし、これは以下のとおり少し混乱です:消去する前にJavaジェネリック - ブリッジメソッド

class x <T> { 
    void set(T t){} 
} 

class y <E> extends x { 
    void set(E e) {} // name clash here 
} 

class z<E> extends x { 
    void set(Object y) {} // no name clash here 
} 

class z1<E> extends x<T> { 
    void set(Object y) {} // name clash here 
} 

消去後:

class x { 
    void set (Object t) {} 
} 

私は、クラスYの名前の衝突を理解したがための名前の衝突が存在しない理由クラスz? また、クラスz1の名前の衝突がありますか?パズルリング

+0

を 'クラスz'は' 'クラスX 'のset'メソッドをオーバーライドします。タイプEとタイプTは厳密に同じタイプではありません。 'class z1'に名前の衝突があります。 –

+0

ちょうどよい推薦です:生の型は使用しないでください。 –

+0

あなたの旗を受け取った、申し訳ありません - 要求通りにできません。 –

答えて

1

あなたが言うように、消去後、setメソッドはObjectをとります。 zは、消去ここでx

2
class y <E> extends x { 
    void set(E e) {} // name clash here 
} 

名前の衝突の後、非ジェネリックを拡張Eは、あなたが設定したメソッドをオーバーライドすることはできませんので、これはよりよく理解するためにZ1の説明をway.see Tのサブクラスではないために発生します。クラスXに、設定方法が

void set(java.lang.Object) 

として解釈されますので、ここでは名前の衝突がない

class z<E> extends x { 
    void set(Object y) {} // no name clash here 
} 

:クラスYの あなたは

class y <E> extends x<E> { 
    void set(E e) {} 
} 

次を持っている必要があり、作業しますまた、クラスzでは、setのパラメータはjava.lang.Object.so no clashです。

次へ:あなたはXに与えるどんなタイプのパラメータセットのパラメータとして持っている必要があるため

class z1<E> extends x<T> { 
    void set(Object y) {} // name clash here 
} 

再びここに名前の衝突が発生します。ここでは、x型のパラメータTに渡しますが、setメソッドのパラメータはjava.lang.Objectになります。したがって名前の衝突。

あなたが持っている必要があり、Zが機能するには:

class z1<E> extends x<Object> { 
     void set(Object y) {} 
} 
+0

クラスyとクラスzについて話すことができます。どちらも型パラメータはクラスxの型パラメータのサブタイプではなく、消去後のクラスyの型はクラスzと同じメソッドシグネチャを持つため、クラスyとクラスzの違いはわかりません。だから、名前がクラスyではなくクラスzで衝突するのはなぜですか? - yapkm01 5分前 – yapkm01

+0

あなたがメソッドセットをオーバーライドしているので、それはいくつかのルールに従わなければなりません。 yとzは両方とも型パラメータを持っています。それは問題ではないので、ここでは問題ではありません。この問題は厳密にはsetメソッドのパラメータ型のためです。 xのsetメソッドでは、次のようになります。 'void set(T t){}' right? このsetメソッドをオーバーライドしようとするすべてのサブクラスは、型Tまたは継承された型Tのオブジェクトを参照できるように、Tのスーパークラスのいずれかのパラメータを持つ必要があります。今はクラスzで、パラメータはObjectです。どのタイプでも参照できます。また、T. – aps

+0

もう1つ:消去後に何が起こるかを考えて自分自身を混同しないでください。消去後に何が起こるかは関係ありません。制約が課され、ジェネリックがより簡単になると思うだけです。 – aps