¿Por qué tengo un error cuando intento anular un enlace genérico con Guice? (TypeLiteral)

Me gustaría reemplazar un enlace de tipo genérico, pero siempre obtuve el mismo error " No implementation was bound ".

Estoy usando roboguice 3.

He aquí un ejemplo de código que uso:

 public interface IParser<I, O> {} public class Parser1 implements IParser<String, String> { IParser<String, String> mParser; @Inject public Parser1(IParser<String, String> parser) { mParser = parser; } } public class Parser2 extends Parser1 { @Inject public Parser2(IParser<String, String> parser) { super(parser); } } public class MyModule extends AbstractModule { @Override protected void configure() { bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1>() {}); } } 

Y aquí está mi creación de inyector:

 RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), Modules.override(new MyModule()).with(new AbstractModule() { @Override protected void configure() { bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser2>() {}); } }) ); 

Si no intento anularlo (sólo el usuario Parser1), todo está bien, cuando anule el objeto estándar con los proveedores, funciona bien también, pero no con TypeLiteral.

Mi error es:

 com.google.inject.CreationException: Unable to create injector, see the following errors: 1) No implementation for IParser<String, String> was bound. 

¿Qué estoy haciendo mal?

Gracias.

Usted debe cambiar la definición de las clases que se implementan su interfaz.

Prueba esto:

 public class Parser1<I, O> implements IParser<I, O> { } public class Parser2<I, O> extends Parser1<I, O> { } 

Y luego puede vincular su interfaz a la clase de esta manera:

 bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1<String, String>() {}); 

No estoy seguro, pero me parece notable que un enlace a una instancia conrete se utiliza en lugar de una Class :

Bind (new TypeLiteral> () {}). A ( nuevo TypeLiteral () {} );

has probado

 bind(new TypeLiteral<IParser<String, String>>() {}).to(Parser2.class}); 

?

  • Junit / Mockito - esperar la ejecución del método
  • Ajustar a las carreteras Android
  • Gradlew appengineEndpointsInstallClientLibs tiene error La ejecución falló para la tarea ': compileJava'. > Versión de origen no válida: 1.7
  • Accesos directos de pantalla de inicio con iconos
  • Error al analizar xml: prefijo sin consolidar con el SDK de Facebook
  • Vista de cuadrícula personalizada
  • Importar código fuente de Android en eclipse
  • Programar un evento para ser ejecutado en el futuro (Cron Job la forma de Android)
  • Configuración de dependencias de Android
  • Cómo navegar desde una pantalla a otra pantalla
  • Android OpenCV con MatOfKeyPoint y detección de feature2d
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.