Skip to content

Instantly share code, notes, and snippets.

@joserodolfofreitas
Created December 6, 2011 19:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joserodolfofreitas/1439519 to your computer and use it in GitHub Desktop.
Save joserodolfofreitas/1439519 to your computer and use it in GitHub Desktop.
CDI with generic class and the hell of type erasure
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?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment