Здравствуйте, yvad, Вы писали:
Y>Есть следующая иерархия:
class A {}
class B extends A {}
class LA<T extends A> {}
class LB<T extends B> extends LA<T> {}
Y>Как скастить LB<B> в LA<A>?
Никак, потому что:
class A {}
class B extends A {}
class LA<T extends A> { T t; }
class LB<T extends B> extends LA<T> {}
...
LB<Integer> lbi = new LB<Integer>();
lbi.t = new Integer(0);
LA<Number> lan = (LA<Number>)lbi;
lan.t = new Double(0.0);
assert (lbi.t instanceof Integer);
Ты можешь скастить только в read-only версию, то есть
LB<Integer> lbi = new LB<Integer>();
lbi.t = new Integer(0);
LA<? extends Number> lan = lbi;
lan.t = new Double(0.0); // compile-time error
assert (lbi.t instanceof Integer);
тогда это будет type safe.