Right, you don't want to use Class<T> as a parameter because it's difficult to get at that "T" at runtime.
Can you use Guice's TypeLiteral class instead? This class provides easy runtime access to the generic parameters. -Russ On Tue, Jun 14, 2011 at 10:58 PM, Alexandre Walter Pretyman < [email protected]> wrote: > Hi, I don't think you want to be passing the Class<T> as an argument. > > This is what I do, not sure if it is the best way, but works for me. > Instead of passing the Class<T> as an argument, I get it from the > Generic parameters: > > > boolean isEnhanced = > getClass().getName().contains("EnhancerByGuice"); > if (isEnhanced) > { > Class<?> superClass = getClass().getSuperclass(); > this.clazz = (Class<T>) ((ParameterizedType) > superClass.getGenericSuperclass()).getActualTypeArguments()[0]; > } > else > { > this.clazz = (Class<T>) ((ParameterizedType) > getClass().getGenericSuperclass()).getActualTypeArguments()[0]; > } > > The isEnhanced check is due to that when you use Guice's AOP on your > classes, they get extended with the String "EnhancerByGuice" as part > of the new name. > > Sucks having to check it by hand, would be better to have an > injector.isEnhanced(instance) to check if the class is actually > enhanced, but according to > http://code.google.com/p/google-guice/issues/detail?id=187 > ; we won't be getting that anytime soon... > > Regards, > > On Jun 7, 3:06 am, ahhughes <[email protected]> wrote: > > Hi All, > > > > This ones a little complex (for me anyway). I have a class that > > requires both a generic argument, and a Class<T> of that generic type > > as a constructor arg. > > > > Easiest to explain with code: > > > > //Supplier, of 'S'.... and it needs Class<S> to do its job > > public abstract class Shop<S> { > > public Shop(Class<S> classOfS){ ... } > > > > } > > > > //FerrariShop is a Shop, but it only supplies Ferrari's... > > public class FerrariShop<F extends AbstractFerrari<?>> extends Shop<F> > > { > > @Inject > > public FerrariShop(Class<F> classOfF, Blah blah){ //Note blah is > > injected too... > > super(classOfF); > > } > > > > } > > > > Then my FastDriver needs to be @Inject'd with a > > 'Provider<FerrariShop<EnzoFerrari>>..... > > > > @Inject > > public FastDriver(Provider<FerrariShop<EnzoFerrari>> > > enzoFerrariShopProvider) {} > > > > I'm a little lost here, so THANKS for helping me if you can :) > > > > p.s. if you are wondering why I am doing this, I am building a > > hierarchy of http requests. Gson is de/serializing the request/ > > response and it needs to know Class<F> for its serialization. For > > reliability I want this to be a constructor arg. Also, Gson is > > fantastic (kudos++)! > > -- > You received this message because you are subscribed to the Google Groups > "google-guice" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/google-guice?hl=en. > > -- You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-guice?hl=en.
