Guice And Scala - Injection on Generics Dependencies
You need a TypeLiteral binding like this:
bind(new TypeLiteral[Repository[Domain]] {})
.annotatedWith(classOf[DomainDependency])
.to(classOf[DomainRepository])
.in(Scopes.SINGLETON)
TypeLiteral
is a special class that allows you to specify a full parameterized type. Basically, you can't instantiate a class with a generic type parameter.
Also, take a look at this answer.
See "How to inject class with generic type?" in the Guice FAQ.
As David says, you need a TypeLiteral
to bind a generic type (remember - generic types are erased to just the class, without the type parameter at run-time).
Another alternative is to something like my Scala Guice library to build the TypeLiteral
s needed by Guice from Scala's Manifest
s. If you mix in the ScalaModule
trait, you would then be able to do something like:
bind[Repository[Domain]]
.annotatedWith[DomainDependency]
.to[DomainRepository]
.in(Scopes.SINGLETON)