generics - Java Wildcard cast to subtype -
this question has answer here:
for historical reasons must use abstract class 2 wildcard parameters:
abstractcolumn<m, i>
and have implementation(idatasource interface):
simplecolumn<i> extends abstractcolumn<idatasource<i>, i>
the problem starts when should cast idatasource<i>
parameter it's implementation, e.g. genericdatasource<i>
:
simplecolumn<i> column; abstractcolumn<genericdatasource<i>, <i>> newcolumn = (abstractcolumn<genericdatasource<i>, <i>>)column;
i'm getting error:
type mismatch: cannot convert abstractcolumn<genericdatasource<i>,i> abstractcolumn<idatasource<i>,i>
and if i'm trying convert idatasource
object(not parameter) genericdatasource
, there no errors:
idatasource<t> ds; genericdatasource<t> gds = (genericdatasource<t>)ds;
why java able convert idatasource
genericdatasource
, can't same in wildcard?
generics tricky @ best of times. start, here 2 bits of code. first (your code) not compile. second compile. difference in type parameter abstractcolumn.
simplecolumn<i> column = null; abstractcolumn<genericdatasource<i>, i> newcolumn1; newcolumn1 = (abstractcolumn<genericdatasource<i>, i>)column; abstractcolumn<idatasource<i>, i> newcolumn2; newcolumn2 = (abstractcolumn<idatasource<i>, i>)column;
normally i'd solve problem putting "? extends i" or "? super i" in 1 of type parameters. however, in case not working. note second type parameter abstractcolumn doesn't matter - removing not resolve problem either.
simplecolumn<i> column = null; abstractcolumn<genericdatasource<i>> newcolumn1; newcolumn1 = (abstractcolumn<genericdatasource<i>>)column; abstractcolumn<idatasource<i>> newcolumn2; newcolumn2 = (abstractcolumn<idatasource<i>>)column;
i think problem you're hitting related compile-time type erasure. basically, when program compiled type parameters converted "object". compiler has realised in particular case, unable perform correct cast (and raise classcastexception) blocking doing this. need java generics guru this!
Comments
Post a Comment