See issue 218 <http://code.google.com/p/google-guice/issues/detail?id=218>.
An assisted inject factory itself can be genericized, but its methods cannot
introduce their own generic types right now.  So assuming you have a limited
number of types T, you can workaround this by changing BarFactory to
BarFactory<T> and registering a BarFactory for each T.

 sam


On Mon, Sep 27, 2010 at 10:58 AM, Chris Conway <
[email protected]> wrote:

> The following code is an example of a factory that produces a `Bar<T>`
> given a `Foo<T>`. The factory doesn't care what `T` is: for any type
> `T`, it can make a `Bar<T>` from a `Foo<T>`.
>
>    import com.google.inject.*;
>    import com.google.inject.assistedinject.*;
>
>    class Foo<T> {
>      public void flip(T x) { System.out.println("flip: " + x); }
>    }
>
>    interface Bar<T> {
>      void flipflop(T x);
>    }
>
>    class BarImpl<T> implements Bar<T> {
>      Foo<T> foo;
>
>      @Inject
>      BarImpl(Foo<T> foo) { this.foo = foo; }
>
>      public void flipflop(T x) { foo.flip(x);
> System.out.println("flop: " + x); }
>    }
>
>    interface BarFactory {
>      <T> Bar<T> create(Foo<T> f);
>    }
>

>    class Module extends AbstractModule {
>      public void configure() {
>        bind(BarFactory.class)
>          .toProvider(
>              FactoryProvider.newFactory( BarFactory.class,
> BarImpl.class )
>                       );
>      }
>    }
>
>    public class GenericInject {
>      public static void main(String[] args) {
>        Injector injector = Guice.createInjector(new Module());
>
>        Foo<Integer> foo = new Foo<Integer>();
>        Bar<Integer> bar =
> injector.getInstance(BarFactory.class).create(foo);
>        bar.flipflop(0);
>      }
>    }
>
> When I run the code, I get the following errors from Guice:
>
>    1) No implementation for BarFactory was bound.
>      at Module.configure(GenericInject.java:38)
>
>    2) Bar<T> cannot be used as a key; It is not fully specified.
>
> I guess the problem is that the BarFactory.create() method doesn't
> match the pattern expected by FactoryProvider, because of the type
> quantifier <T>. But there isn't a real problem here: BarImpl.class
> (with no type literal) is exactly what we need to create a Bar<T>
> given a Foo<T>. Is there a way to configure Guice to generate a
> BarFactory instance for me, or do I just need to write the BarFactory
> instance by hand?
>
> --
> 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]<google-guice%[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