2013-07-11 487 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

'?超級形狀「將在那裏工作。 「Producer Extends,Consumer Super」 –

+0

@MichaelMyers:Au contraire:http://ideone.com/TYr10C。 '基地<? super Shape>'接受'Shape'的任何*超類型*的'Base'。 –

回答

21

因爲編譯器不知道new Circle是有效的。考慮以下代碼:「但是,編譯器可以看到它真的是一個Base<Square>

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

(FYI,一個非常類似的例子在Java tutorial on wildcards給出)

您現在可以驚呼。但不是一般的。考慮這個:

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

+1或'(Math.random()> .5)?新基地():新基地()'。編譯器無法想象那個問題。 – arshajii

+0

現在很明顯。謝謝 ! :) –