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].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.

Reply via email to