If <T> is only used as an assisted param (and *not* used by any injected
ones), then I think we can get away with just ignoring it. The compiler
will make sure the types are safe, and we can just pretend T is its erased
type.  So long as the user supplies us the T and we don't have to worry
about locating anything that references a T... there won't be any unknowns.

sam

On Wed, May 27, 2015, 1:08 AM Nate Bauernfeind <nate.bauernfe...@gmail.com>
wrote:

> Sam, I don't see how it could ever work if T itself had generic
> parameters. I can only see two solutions 1) push the burden onto the client
> of the factory and force them to provide a type literal or 2) the generic
> factory methods only work for a subset of types. In my opinion option 2 is
> useless: you should be able to bind Foo[List[String]] to a different
> implementation than a Foo[List[Int]] for example.
>
> The current solution is to add the type parameter to the factory, which
> requires a one-to-one binding per factory. I thought that people don't like
> this option because they'd like to remove the one-to-one binding
> restriction, or perhaps they don't want to inject `n` different Factories
> someplace. (There might be other advantages I'm being shortsighted about;
> these are just the two that pop out as large costs.)
>
> Removing these particular restrictions is clearly a one-to-many binding
> argument. In fact, a non one-to-many implementation is relatively
> straightforward! Here's an example in scala (for terseness):
>
> object T extends App {
>   class Foo[T] (@Assisted t: T) { override def toString = s"Foo($t)" }
>   class FooString @Inject()(@Assisted t: String) extends Foo[String](t)
>   class FooInt @Inject()(@Assisted t: Integer) extends Foo[Integer](t)
>
>   trait F {
>     def create(t: String): Foo[String]
>     def create(i: Int): Foo[Integer]
>   }
>
>   val mod = new ScalaModule {
>     def configure(): Unit = {
>       install(new FactoryModuleBuilder()
>         .implement(typeLiteral[Foo[String]], typeLiteral[FooString])
>         .implement(typeLiteral[Foo[Integer]], typeLiteral[FooInt])
>         .build(typeLiteral[F]))
>     }
>   }
>
>   import net.codingwell.scalaguice.InjectorExtensions._
>   val injector = Guice.createInjector(mod)
>   println(injector.instance[F].create(42))
>   println(injector.instance[F].create("hello world"))
> }
>
> There are a couple of issues that you can't really get around. 1) You need
> to subclass Foo or else the constructor loses the parameter's type
> information due to erasure. 2) you need to enumerate each create method in
> the factory. 3) you need one implement call per T in your factory. And
> subtly, 4) the method `def create[T](t: T): Foo[T]` doesn't exist!
>
> This is three times as much work as would be nice, but due to JVM
> restrictions I don't think you can remove the additional work without
> requiring TypeReferences on the create method.
>
> Does this shed light from my perspective, or am I misunderstanding the
> problem?
>
> On Tue, May 26, 2015 at 6:16 PM Sam Berlin <sber...@gmail.com> wrote:
>
>> The "many to one binding" thing isn't really the reason since it's not a
>> binding, it's just a method call in your factory.
>>
>> For assistedinject, the lack of being able to specify <T> on the method
>> w/o also specifying it on the factory is really just a no one's had the
>> time to sit down and figure out how to do it.  See the bug @
>> https://github.com/google/guice/issues/218 .
>>
>> Implementation's @
>> https://github.com/google/guice/blob/master/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java
>> if you want to give it a go.
>>
>> sam
>>
>> On Tue, May 26, 2015 at 6:08 PM Nate Bauernfeind <
>> nate.bauernfe...@gmail.com> wrote:
>>
>>> Assuming you meant:
>>> interface FooFactory {
>>>   <T> Foo<T> create(T bar);
>>> }
>>>
>>> No, this does not work. It would require one-to-many bindings, which, if
>>> you read the recent forum's history, is not supported.
>>>
>>> This is the closest you can get. I use it pretty frequently:
>>> interface FooFactory<T> {
>>>   Foo<T> create(T bar);
>>> }
>>>
>>> You will need to use type literals to capture the generic types when you
>>> create the assisted inject factories. (See:
>>> http://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/TypeLiteral.html
>>> )
>>>
>>> Nate
>>>
>>> On Tue, May 26, 2015 at 5:52 PM Brad Micholson <fourofcl...@gmail.com>
>>> wrote:
>>>
>>>> Is there currently any way to use type inference in an assisted inject
>>>> factory?
>>>> For example, is there any way to use an interface like the following as
>>>> an assisted inject factory?
>>>>
>>>>
>>>> interface FooFactory
>>>> {
>>>>   Foo<T> create(T bar);
>>>> }
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "google-guice" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to google-guice+unsubscr...@googlegroups.com.
>>>> To post to this group, send email to google-guice@googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/google-guice.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/google-guice/3b354f12-1927-44fb-ac0d-94b28941ced6%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/google-guice/3b354f12-1927-44fb-ac0d-94b28941ced6%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "google-guice" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to google-guice+unsubscr...@googlegroups.com.
>>> To post to this group, send email to google-guice@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/google-guice.
>>>
>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/google-guice/CAHNex995t_ae%2BKnFpHSxB5vVHLNkP%2BhY%2BdCt5-8VQOpM1BsHqw%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/google-guice/CAHNex995t_ae%2BKnFpHSxB5vVHLNkP%2BhY%2BdCt5-8VQOpM1BsHqw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>
>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "google-guice" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to google-guice+unsubscr...@googlegroups.com.
>> To post to this group, send email to google-guice@googlegroups.com.
>> Visit this group at http://groups.google.com/group/google-guice.
>>
> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/google-guice/CAJEBNUdoCzATtdVH2zBS%2BZgdjQYUCWbq9gn2xh-AvfzEwkB6Dg%40mail.gmail.com
>> <https://groups.google.com/d/msgid/google-guice/CAJEBNUdoCzATtdVH2zBS%2BZgdjQYUCWbq9gn2xh-AvfzEwkB6Dg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>
>
>> For more options, visit https://groups.google.com/d/optout.
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "google-guice" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to google-guice+unsubscr...@googlegroups.com.
> To post to this group, send email to google-guice@googlegroups.com.
> Visit this group at http://groups.google.com/group/google-guice.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/google-guice/CAHNex98Xi8O3f6z%3Dw3PXtF%2BCsJYyrfoK2oeWrOKgVkyDMzrr9g%40mail.gmail.com
> <https://groups.google.com/d/msgid/google-guice/CAHNex98Xi8O3f6z%3Dw3PXtF%2BCsJYyrfoK2oeWrOKgVkyDMzrr9g%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
Visit this group at http://groups.google.com/group/google-guice.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-guice/CAJEBNUc4NPP3AGpu7%3DH-5vB3m59XikRnAA4-cmaET7S_vEhi%3DQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to