2013-07-11 15 views
11

मैं जावा प्रकार मिटा नियमों के बारे में पूछना चाहता हूं।जावा जेनेरिक प्रकार मिटा

हम वर्गों है:

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: एयू contraire: http://ideone.com/TYr10C। 'बेस '' आकार 'के किसी भी * सुपरटेप * के' बेस 'को स्वीकार करता है। –

उत्तर

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

अब यह स्पष्ट है। धन्यवाद ! :) –

संबंधित मुद्दे