考虑一组类似 MVP 的类型。存在一个抽象的 Presenter,带有一个 View 接口:
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
method:
@Provides
LoginView provideLoginView() {
return new LoginViewImpl();
}
在 Guice 中你可以用同样的方式写这个,或者只是bind(LoginView.class).to(LoginViewImpl.class)
.
然而,在 Dagger(v1 和来自 Google 的 2.0-SNAPSHOT)中,这会产生错误,因为它无法弄清楚是什么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
Dagger 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 中的 SerializedTypeOracleBuilder)?
请注意,当V
被称为Provider<V>
, Lazy<V>
, etc.