2013-07-11 26 views
11

Java tipi silme kuralları hakkında soru sormak istiyorum.Java genericics tür silme

biz sınıfları varsa: setx çağırarak neden

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 
    } 
} 

beni lütfen açıklayabilir() yöntemi derleme sorunu neden olur?

+1

'? Süper Şekil orada çalışırdı. "Üretici Uzatıcılar, Tüketici Süper" –

+0

@MichaelMyers: Au contraire: http://ideone.com/TYr10C. 'Baz '' Shape' türünün herhangi bir * tipini 'kabul eder. –

cevap

21

Derleyici, new Circle'un geçerli olduğunu bilmiyor. Bu kodu göz önünde bulundurun: "Ama derleyici gerçekten Base<Square> olduğunu görüyorum"

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

(. Bilginize, çok benzer bir örnek Java tutorial on wildcards verilmektedir)

Artık haykırmak olabilir. Ama genel olarak değil. Bunu düşünün:

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

+1 Veya '(Math.random()> .5)? Yeni Temel (): yeni Temel () '. Derleyici bunu anlayamaz. – arshajii

+0

Şimdi açık. Teşekkürler ! :) –