Witam
Zastanawia mnie jedna kwestia w typach generycznych Javy. Mam taki kod:
interface A {
void metoda();
}
class B<T> {
void set() {
T a = (T)new Object();
}
}
public class Main {
public static void main(String[] args) {
B<A> b = new B<A>();
b.set();
}
Ponieważ w czasie kompilacji T zostaje przekształcone do Object ta linijka: T a = (T)new Object(); powoduje zrzutowanie Object do Object a więc wszystko działa bez zarzutu. Jednak gdy definicje klasy zmienie w taki sposób:
class B<T extends A> to dostaje wyjątek ClassCastException. Dla mnie jest to zastanawiające bo skoro Java zamarze typ A do Object to znowu ten kod nie powinien powodować problemów. Jedyne wytłumaczenie jakie przychodzi mi do głowy to to że w przypadku extends typ nie jest zamazywany do Object tylko do typu A. Czy ktoś może potwierdzić to przepuszczenie ?