2011-02-11 9 views
7

Tengo una interfaz TestInterface < U, V > que tiene muchas implementaciones, cuando se utiliza para la unión Guice me sale un mensaje diciendo TestInterface < Impl1, Impl2 > no unido a una implementación. A continuación está la sintaxis que estoy usando para vincular la interfaz con sus implementaciones.Guice annotatedWith para la interfaz con los genéricos

bind (TestInterface.class) .annotatedWith (Names.named ("Impl1Test")) a (Impl1.class);

p.s. Probé con una interfaz ficticia pero sin genéricos y funcionó bien, reconozco que los genéricos necesitan algo especial.

Respuesta

11

Al enlazar tipos genéricos, necesita utilizar un TypeLiteral en lugar del class puro. De lo contrario, Guice no podría distinguir entre los tipos genéricos. En su caso, se vería algo como esto:

bind(new TypeLiteral<TestInterface<Impl1, Impl2>>(){}) 
    .annotatedWith(Names.named("Impl1Test")) 
    .to(Impl1.class); 

Es posible que ni siquiera necesita el annotatedWith si no tiene otras cosas que desea enlazar como TestInterface<Impl1, Impl2>. Tenga en cuenta que {} en la creación de TypeLiteral ... una subclase anónima de TypeLiteral es necesaria para conservar la información de tipo genérico.

+0

dulce, gracias Colin! – Abidi

Cuestiones relacionadas