¿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.
- En Android, ¿cómo puedo encontrar el llamador de un método de manera eficiente
- ¿Cómo leer todos los bytes juntos vía Bluetooth?
- Eclipse salta líneas mientras depura
- Android: ¿Cómo evitar que la imagen sea escalada en ImageView o ImageButton?
- ¿Qué hace transitive = true en Gradle exactamente hacer (wrt crashlytics)?
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.
- OnClickListener en RecyclerView.ViewHolder
- Cómo evitar que aparezca automáticamente el teclado de Android cuando comience la actividad
- ¿Cuál es el propósito de la anotación Android @Widget?
- Dibuja una ruta siguiendo tu ubicación en Google Maps para Android
- Cómo sincronizar datos entre dispositivos en Wi-Fi
- Cómo identificar el móvil está inactivo?
- Android EditText maxLength no funciona
- Android: ¿Es posible dibujar una vista en la parte superior del mapa como una superposición
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});
?