2013-07-11 27 views
11

Java型消去ルールについてお聞きしたいと思います。私たちは、クラスがある場合Javaジェネリック型消去

は:

public class Shape{} 
public class Circle extends Shape{} 


public class Base<T extends Shape>{ 
    T x; 
    public void setX(T t){} 
} 

public class MainClass(){ 
    public static void main(String... _arg){ 
     Base<? extends Shape> bs = new Base<Circle>(); 
     bs.setX(new Circle()); // <- compilation problem 
    } 
} 

をSETX()メソッドを呼び出すと、コンパイルの問題を引き起こし、なぜあなたは私を説明していただけますか?

+1

'?スーパーシェイプ 'がそこで動作します。 "プロデューサーはコンシューマースーパーを拡張する" –

+0

@MichaelMyers:Au contraire:http://ideone.com/TYr10C。 'Base <? super Shape> 'は' Shape'の任意の*スーパータイプ*の 'Base'を受け取ります。 –

答えて

21

コンパイラはnew Circleが有効であることを知らないので、

Base<? extends Shape> bs = new Base<Square>(); // Really a Base<Square> 
bs.setX(new Circle()); 

(FYI、非常によく似た例がJava tutorial on wildcardsに与えられている。)

あなたは今叫ぶこと「だが、コンパイラが、それは本当にBase<Square>だ見ることができます!」:このコードを考えてみましょう。しかし一般的ではない。これを考慮する:

Base<? extends Shape> bs = someInterface.getBaseOfSomeKindOfShape(); 
bs.setX(new Circle()); 
+6

+1または '(Math.random()> .5)?新しいベース():新しいベース() 'コンパイラがそれを理解することはできません。 – arshajii

+0

今は明らかです。ありがとう! :) –

関連する問題