[seam-dev] CDI with generic class and the hell of type erasure.

Ales Justin ales.justin at gmail.com
Tue Dec 6 17:45:47 EST 2011


You could do something like this:

    @SuppressWarnings({"unchecked"})
    @Produces
    public GenericQuery injectClass(InjectionPoint ip) {
        Annotated annotated = ip.getAnnotated();
        Class clazz = Object.class;
        Type type = annotated.getBaseType();
        if (type instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) type;
            clazz = (Class) pt.getActualTypeArguments()[0];
        }
        return new GenericQuery(clazz);
    }

--

    @Inject
    GenericQuery<String> gqs;
    @Inject
    GenericQuery<Number> gqn;

--

        System.out.println("GQS: " + gqs.getClazz());
        System.out.println("GQN: " + gqn.getClazz());

--

GQS: class java.lang.String
GQN: class java.lang.Number

--

https://github.com/alesj/cdi-arq-workshop/commit/64860f15197be40a7714dfd8a7da931c1db11411

HTH

-Ales

> Hey guys, how you doing?
> 
> I'm trying to achieve something that might be impossible, but before concluding that, I'd like to ask you, CDI gurus!
> 
> I have the following class:
> 
> public class Foo<T> {
> 
>     public TypedQuery<T> getQuery(){
> 
>     }
> 
> }
> 
> As you can Imagine, inside my getQuery method, I'd have to use "T.class" to make it TypedQuery. which is impossible due java generics type erasure.
> 
> so I'd have to build a private field to hold the t.class for me.
> 
> public class Foo<T> {
> 
>     private Class<T> klass;
> 
>     public TypedQuery<T> getQuery(){
> 
>     }
>     
>     public void setKlass(Class<T> klass){
>         this.klass = klass;
>     }
> }
> 
> The problem is that forcing this 'setKlass' feels very ugly to the api, and it's not very error prone, since one could easily forget to set this configuration.
> 
> So I had an Idea: force the setKlass inside the constructor:
> 
> public class Foo<T> {
> 
>     private Class<T> klass;
>     
>     public Foo(Class<T> klass){
>         this.klass = klass;
>     }
> 
>     public TypedQuery<T> getQuery(){
> 
>     }
> 
> }
> 
> Unfortunatelly, this breaks cdi, since it cannot inject it anymore. At least AFAIK.
> 
> So, is there a way out of this? maybe using a secret solder feature?
> _______________________________________________
> seam-dev mailing list
> seam-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/seam-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/seam-dev/attachments/20111206/7c16657b/attachment-0001.html 


More information about the seam-dev mailing list