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.

Reply via email to