 <p>In short, there is no such thing as <code>Foo&lt;String&gt;</code> at runtime due to the type <a href="http://download.oracle.com/javase/tutorial/java/generics/erasure.html" rel="nofollow">Type Erasure</a>. The type information is lost.</p> <p>Instead, you can expose <code>Bar</code> as raw <code>Foo</code> with service property <code>typeArg=java.lang.String</code> and use filter when injecting it to the consumer.</p> <p>Other way is to introduce interfaces <code>FooString extends Foo&lt;String&gt; { }</code>, <code>FooDouble extends Foo&lt;Double&gt; { }</code> and use them instead of <code>Foo</code>.</p>