spring - Extend class from another extended Parametrized Generic class -


i have genericservice support classes ( genericservice, genericserviceimpl, genericdao,generichibernatedao) generic service,dao layer.

normaly works fine, when extend type parametrized service abstract generic services.when extend extended services in different service gives:

caused by: java.lang.classcastexception: java.lang.class cannot cast java.lang.reflect.parameterizedtype

error.

my generichibernatedao:

@transactional public abstract class generichibernatedaosupport extends hibernatedaosupport implements genericdaotemplate { private class type;

public generichibernatedaosupport() {     this.type =  (class<t>) ((parameterizedtype) getclass().getgenericsuperclass()).getactualtypearguments()[0]; }  @autowired @qualifier(value = "productsessionfactory")  public void bindsessionfactory(sessionfactory sessionfactory) {     setsessionfactory(sessionfactory); }  public class<t> gettype() {     return type; }  public void settype(class<t> type) {     this.type = type; }  protected session getcurrentsession() {     return gethibernatetemplate().getsessionfactory().getcurrentsession(); }  public id persist(t newinstance) {     return (id) gethibernatetemplate().save(newinstance); }  public void update(t transientobject) {     gethibernatetemplate().update(transientobject); } 

here standart extended hibernatedao class:

@repository public class standadhibernatedao extends standardhibernatedaosupport<standard, long> implements standarddao { 

above extend operation works fine, when tried this:

@repository public class extendstandardgatewayhibernatedao extends standadhibernatedao implements extendedstandarddao { 

it throws :

caused by: java.lang.classcastexception: java.lang.class cannot cast java.lang.reflect.parameterizedtype.

do have idea?

to learn value of t you'll need capture in type definition subclassing generichibernatedaosupport:

class mycardao extends generichibernatedaosupport<car> {} 

you can anonymous class if want:

generichibernatedaosupport<car> mycardao = new generichibernatedaosupport<car>{}(); 

to resolve value of t, can use typetools:

class<?> cartype = typeresolver.resolverawargument(generichibernatedaosupport.class, mycardao.getclass()); assert cartype == car.class; 

Comments