2013-07-11 17 views
11

Mi piacerebbe chiedere informazioni sulle regole di cancellazione del tipo java.Java generics type erasure

Se abbiamo classi:

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

Si può spiegare il motivo per cui mi chiama setX() metodo provoca problemi di compilazione?

+1

'? la forma eccellente funzionerebbe là. "Producer Extends, Consumer Super" –

+0

@MichaelMyers: Au contraire: http://ideone.com/TYr10C. 'Base 'accetta una' Base' di qualsiasi * supertipo * di 'Shape'. –

risposta

21

Poiché il compilatore non sa che new Circle è valido. Considerate questo codice: "Ma il compilatore può vedere che è davvero un Base<Square>"

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

(. Cordiali saluti, un esempio molto simile figura in Java tutorial on wildcards)

Ora puoi esclamare. Ma non in generale. Considera questo:

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

+1 Oppure '(Math.random()> .5)? nuova Base (): nuova Base () '. In nessun modo il compilatore può capirlo. – arshajii

+0

Ora è chiaro. Grazie ! :) –