抽象超类中的泛型@Inject字段
考虑一组类似 MVP 的类型。存在一个抽象的表示器,具有视图界面:
public interface View {
//...
}
public abstract class AbstractPresenter<V extends View> {
@Inject V view;
//...
}
然后,让我们有一个特定的具体表示器子类,以及它的视图接口和实现:
public interface LoginView extends View {
//...
}
public LoginPresenter extends AbstractPresenter<LoginView> {
//...
}
public class LoginViewImpl implements LoginView {
//...
}
在 Dagger 模块中,我们当然会定义一个方法:@Provides
@Provides
LoginView provideLoginView() {
return new LoginViewImpl();
}
在Guice中,你可以用同样的方式写这个,或者只是.bind(LoginView.class).to(LoginViewImpl.class)
但是,在 Dagger(v1 和 Google 的 2.0-SNAPSHOT)中,这会产生错误,因为它无法确定在为 创建绑定连接时是什么。另一方面,Guice 认为,因为它实际上是在创建一个 ,所以它需要一个 .V
AbstractPresenter<V>
LoginPresenter
LoginView
匕首 1.2.2:
foo.bar.AbstractPresenter$$InjectAdapter.java:[21,31] cannot find symbol
symbol: class V
location: class foo.bar.AbstractPresenter$$InjectAdapter
匕首2.0快照:
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)
我的问题:这是一个错误吗?这是缺少的功能吗?或者这是Dagger保护我们免受的性能问题(GWT RPC中的La SerializableTypeOracleBuilder)?
请注意,当称为 、 等时,也会发生同样的问题。V
Provider<V>
Lazy<V>