On Sat, 2010-11-20 at 12:42 -0500, Christian Goudreau wrote:

>         Am I right in saying Guice doesn't supporting binding generic
>         methods currently even with TypeLiteral/FactoryProvider
>         tricks? 
>         
> That does work Using Guice 3.0 Assisted injection and TypeLiteral:
>  
>     install(new GinFactoryModuleBuilder().implement(new
> TypeLiteral<Printable<Country>>() { }, new
> TypeLiteral<PrintableImpl<Country>>() { }).build(new
> TypeLiteral<PrintableFactory<Country>>() {
>     }));
> 
> 
> Well, the caveat is that I have to bind every permutation.


Right. I don't have concrete types for classes at compile time to give
to a TypeLiteral, I have method generics like these -

 Column<String, String> c1 = Builder.newColumn("name1", "value");
 Column<byte[], String> c2 = Builder.newColumn(key, "value");
 Column<TimeUUID, byte[]> c2 = Builder.newColumn(tkey, value);

etc


>  I'm sure something similar can be done with normal provider. Also
> given the code you gave, I think assisted injection would be a cleaner
> solution.

I'd love to see something working.

Bill



> 
> Cheers,
> 
> 
> 
> On Sat, Nov 20, 2010 at 10:36 AM, Bill de hÓra <[email protected]>
> wrote:
> 
>         Thanks Fred, the ProviderFactory's 'free' implementation had
>         lead me down the wrong path. - normal Providers were exactly
>         what I needed.  I ended up with this
>         
>         public class Module extends AbstractPropertiesModule
>         {
>             @Override
>             protected void configureModule() {
>         
>         bind(ColumnFactory.class).toProvider(ColumnFactoryProvider.class);
>             }
>         
>             static class ColumnFactoryProvider implements
>         Provider<ColumnFactory>
>         
>         
>             {
>                 @Override
>                 public ColumnFactory get() {
>                     return new ColumnFactory()
>                     {
>                         @Override
>         
>         
>                         public <N, V> Column<N, V> create(N name, V
>         value) {
>                             return new ColumnImpl<N, V>(name, value);
>                         }
>         
>                         @Override
>                         public <N, V> Column<N, V> create(N name) {
>                             return new ColumnImpl<N, V>(name);
>                         }
>         
>                         @Override
>                         public <N, V> Column<N, V> create(N name, V
>         value, Long timestamp) {
>                             return new ColumnImpl<N, V>(name, value,
>         timestamp);
>         
>         
>                         }
>                     };
>                 }
>             }
>         }
>         
>         public class Builder
>         {
>             private static Injector theInjector =
>         Guice.createInjector(new datagrid.api.module.Module());
>             private static ColumnFactory theColumnFactory =
>         theInjector.getInstance(ColumnFactory.class);
>         
>         
>         
>             public static <K, V> Column<K, V> newColumn(K name, V
>         value) {
>                 return theColumnFactory.create(name, value);
>             }
>         
>             public static <K, V> Column<K, V> newColumn(K name) {
>                 return theColumnFactory.create(name);
>             }
>         
>             public static <K, V> Column<K, V> newColumn(K name, V
>         value, Long timestamp) {
>                 return theColumnFactory.create(name, value,
>         timestamp);
>             }
>         
>         }
>         
>         also a nice approach for legacy factory/builder code.
>         
>         
>         Bill
>         
>         
>         
>         
>         On Sat, 2010-11-20 at 09:21 -0500, Fred Faber wrote:
>         
>         
>         > I envision your interface as:
>         > 
>         > 
>         > interface ColumnFactory {
>         >   <K, V> Column<K, V> newColumn(
>         >       K name, V value, long timestampMillis);
>         > }
>         > 
>         > Then you could adapt your current implementation:
>         > 
>         > 
>         > bind(ColumnFactory.class)
>         >   .toProvider(new Provider<ColumnFactory>(){
>         >      @Override public ColumnFactory get() {
>         >          return  new ColumnFactory() {
>         >             @Override  public  <K, V> Column<K, V>   
>         >                newColumn(
>         >                   K name, V value, long timestampMillis) {
>         >                  return Builder.newColumn(
>         >                      name, value, timestampMillis);
>         >                  }
>         >                );
>         >             }
>         >           }});
>         > 
>         > 
>         > Nothing to worry about here with generic methods.
>         > 
>         > 
>         > -Fred
>         > 
>         > 
>         > 
>         > On Sat, Nov 20, 2010 at 8:58 AM, Bill de hÓra
>         > <[email protected]> wrote:
>         > 
>         >         
>         >         I have a Builder object that generates objects with
>         >         generic methods like this -
>         >         
>         >         public class Builder
>         >         {
>         >             public static <K, V> Column<K, V> newColumn(K
>         >         name, V value, long tstamp) {
>         >                 return new ColumnImpl<K, V>(name, value,
>         >         tstamp);
>         >             }
>         >         }
>         >         
>         >         ie, it's akin to Guava's Maps/Lists classes. I'd
>         >         like the impl classes to be provided by Guice, eg
>         >         
>         >         public class Builder
>         >         {
>         >             private static Injector theInjector =
>         >         Guice.createInjector(new
>         >         datagrid.api.module.Module());
>         >             private static ColumnFactory theColumnFactory =
>         >         theInjector.getInstance(ColumnFactory.class);
>         >         
>         >             public static <K, V> Column<K, V> newColumn(K
>         >         name, V value, long tstamp) {
>         >                 return theColumnFactory.create(name, value,
>         >         long);
>         >             }
>         >         }
>         >         
>         >         Am I right in saying Guice doesn't supporting
>         >         binding generic methods currently even with
>         >         TypeLiteral/FactoryProvider tricks? 
>         >         
>         >         Bill 
>         >         -- 
>         >         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 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 google-guice
>         [email protected].
>         For more options, visit this group at
>         http://groups.google.com/group/google-guice?hl=en.
>         
> 
> 
> 
> 
> -- 
> Christian Goudreau
> 
> www.arcbees.com
> 
> 
> 
> 
> -- 
> 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 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