Supponiamo che ci sia il seguente codice:Perché il casting implicito funziona mentre il casting di reflection genera un'eccezione?
@SuppressWarnings("unchecked")
public static <T> T implicitCaster(Class<T> cls, Object o) {
return (T) o;
}
public static <T> T reflectionCaster(Class<T> cls, Object o) {
return cls.cast(o);
}
Il codice funziona come previsto in entrambi i casi con la seguente eccezione, trovato in primitive:
public static void main(String[] args) {
System.out.println(implicitCaster(int.class, 42));
System.out.println(reflectionCaster(int.class, 42));
}
La prima chiamata funziona come previsto, ma la seconda chiamata genera java.lang.ClassCastException
.
Si tratta di un caso in cui è stato ignorato l'autoboxing? O è impossibile fornire autoboxing in questo caso, di reflection casting? Oppure c'è qualcos'altro che causa questa incoerenza?
Edit: chiamando questo codice funziona come previsto:
public static void main(String[] args) {
System.out.println(implicitCaster(Integer.class, 42));
System.out.println(reflectionCaster(Integer.class, 42));
}
Ho scritto lì che il codice funziona per ogni classe data con l'eccezione dei primitivi; quindi è possibile trasmettere un oggetto a un tipo generico. In secondo luogo puoi lanciare oggetti ai primitivi. – m3th0dman
@ m3th0dman: non ho detto che è impossibile. Ho detto che non ha alcun effetto in fase di runtime. – SLaks
Capisco ora; ma questo tipo di rompere il contratto del metodo cast non lo fa? Tecnicamente il cast è possibile. – m3th0dman