2017-11-09 5 views
1

ここで何が起こっていて、それを理解していますか?彼らが正しく使用されてきたことを確認しています後ちなみにこれらの奇妙なオーバーライドルールを消去する方法を説明できますか?

class C<T> { 
    T id(T x) { 
     return null; 
    } 
} 

class D extends C<String> { 
    public Integer id(Integer x) { // compiles! but T shall be String ??? 
     return 7; 
    } 
} 

    public static void main(String[] args) { 

     System.out.println(new D().id("7")); // null 
     System.out.println(new D().id(7)); // 7 

    } 

私はこのようなDを宣言した場合、コンパイルがName clash: The method id(Object) of type D has the same erasure as id(T) of type C<T> but does not override it:

class D extends C<String> { 
    public Object id(Object x) { // compile error ! 
     return 7; 
    } 
} 

答えて

3

で失敗するコンパイラがObjectであなたの型パラメータを置き換えます。だから、コンパイル後に、元のクラスD

public Object id(Object x) 

まったく問題あり
public Integer id(Integer x) 

を持っています。

ただし、2番目の例では、同じクラスにpublic Object id(Object x)という2つのバージョンがあります。

+0

Nitpick:Cのidメソッドは、OPの例では公開されていません。 (まだ+1) –

0

@Overrideアノテーションを使用して、メソッドが実際に別のメソッドをオーバーライドしているかどうかを確認します。

最初のケースでは、2つのメソッドがあります.1つはStringを必要とし、もう1つはIntegerを必要とします。

スーパー・タイプの消去後に既に終了しているのと同じ方法を作成しました。

関連する問題