Campos genéricos @ Injetados em uma superclasse abstrata
Considere um conjunto de tipos MVP-ish. Existe um Presenter abstrato, com uma interface View:
public interface View {
//...
}
public abstract class AbstractPresenter<V extends View> {
@Inject V view;
//...
}
Então, vamos ter uma subclasse específica de apresentador concreto, com sua interface e implementação de visualização:
public interface LoginView extends View {
//...
}
public LoginPresenter extends AbstractPresenter<LoginView> {
//...
}
public class LoginViewImpl implements LoginView {
//...
}
Em um módulo Dagger, é claro que definiríamos um@Provides
método:
@Provides
LoginView provideLoginView() {
return new LoginViewImpl();
}
No Guice, você pode escrever da mesma maneira, ou apenasbind(LoginView.class).to(LoginViewImpl.class)
.
No entanto, no Dagger (v1 e 2.0-SNAPSHOT do Google), isso produz um erro, pois não consegue descobrir o queV
é ao criar a fiação de ligação paraAbstractPresenter<V>
. Por outro lado, Guice descobre isso porque, na verdade, está criando umLoginPresenter
, por isso precisa de uma implementação deLoginView
.
Adaga 1.2.2:
foo.bar.AbstractPresenter$InjectAdapter.java:[21,31] cannot find symbol
symbol: class V
location: class foo.bar.AbstractPresenter$InjectAdapter
Adaga 2.0-INSTANTÂNEO:
Caused by: java.lang.IllegalArgumentException: V
at dagger.internal.codegen.writer.TypeNames$2.defaultAction(TypeNames.java:39)
at dagger.internal.codegen.writer.TypeNames$2.defaultAction(TypeNames.java:36)
at javax.lang.model.util.SimpleTypeVisitor6.visitTypeVariable(SimpleTypeVisitor6.java:179)
at com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1052)
at dagger.internal.codegen.writer.TypeNames.forTypeMirror(TypeNames.java:36)
at dagger.internal.codegen.MembersInjectorGenerator.write(MembersInjectorGenerator.java:142)
at dagger.internal.codegen.MembersInjectorGenerator.write(MembersInjectorGenerator.java:61)
at dagger.internal.codegen.SourceFileGenerator.generate(SourceFileGenerator.java:53)
at dagger.internal.codegen.InjectBindingRegistry.generateSourcesForRequiredBindings(InjectBindingRegistry.java:101)
at dagger.internal.codegen.ComponentProcessor.process(ComponentProcessor.java:149)
Minha pergunta: isso é um bug? Esse recurso está faltando? Ou esse é um problema de desempenho que o Dagger está nos protegendo (no SerializableTypeOracleBuilder no GWT RPC)?
Observe que esse mesmo problema ocorre quandoV
é referido comoProvider<V>
, Lazy<V>
etc.