小编Col*_*rth的帖子

Generic @Inject'd字段在抽象超类中

考虑一组MVP-ish类型.存在一个抽象的Presenter,带有View接口:

public interface View {
    //...
}

public abstract class AbstractPresenter<V extends View> {
    @Inject V view;
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后,让我们有一个特定的具体的presenter子类,其视图接口和实现:

public interface LoginView extends View {
    //...
}
public LoginPresenter extends AbstractPresenter<LoginView> {
    //...
}

public class LoginViewImpl implements LoginView {
    //...
}
Run Code Online (Sandbox Code Playgroud)

在Dagger模块中,我们当然会定义一个@Provides方法:

@Provides
LoginView provideLoginView() {
    return new LoginViewImpl();
}
Run Code Online (Sandbox Code Playgroud)

在Guice你可以用同样的方式写这个,或者只是bind(LoginView.class).to(LoginViewImpl.class).

但是,在Dagger(来自Google的v1和2.0-SNAPSHOT)中,这会产生错误,因为它无法弄清楚V创建绑定布线时的情况AbstractPresenter<V>.另一方面,Guice指出,因为它实际上是在创建一个LoginPresenter,所以它需要一个实现LoginView.

匕首1.2.2:

foo.bar.AbstractPresenter$$InjectAdapter.java:[21,31] cannot find symbol
  symbol:   class V
  location: class foo.bar.AbstractPresenter$$InjectAdapter
Run Code Online (Sandbox Code Playgroud)

Dagger 2.0-SNAPSHOT:

Caused …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection guice dagger

23
推荐指数
1
解决办法
1671
查看次数

如何从注释处理器中的嵌套注释读取 Class[] 值

我正在尝试使用Java注释处理工具生成一些代码,我有嵌套注释,其中父注释值是子注释的数组,子注释值是类的数组。

注释:

public @interface ParentAnnotation {
    ChildAnnotation[] value();
}
public @interface ChildAnnotation {
    Class<?>[] value();
}
Run Code Online (Sandbox Code Playgroud)

用法:

@ParentAnnotation(
{
      @ChildAnnotation({Foo.class, Bar.class}),
      @ChildAnnotation({Goo.class, Doo.class})
})
public class Sample{
}
Run Code Online (Sandbox Code Playgroud)

使用我的子类型调用value()注释Processor失败,并出现以下异常:

Error:java: error while creating source file javax.lang.model.type.MirroredTypeException: Attempt to access Class object for TypeMirror org.dominokit.samples.layout.shared.extension.LayoutEvent
    at com.sun.tools.javac.model.AnnotationProxyMaker$MirroredTypeExceptionProxy.generateException(AnnotationProxyMaker.java:308)
    at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:84)
    at com.sun.proxy.$Proxy28.value(Unknown Source)
    at org.dominokit.domino.apt.client.processors.module.client.presenters.PresenterProxySourceWriter.generateFireActivationEvent(PresenterProxySourceWriter.java:238)
    at org.dominokit.domino.apt.client.processors.module.client.presenters.PresenterProxySourceWriter.asTypeBuilder(PresenterProxySourceWriter.java:64)
    at org.dominokit.domino.apt.client.processors.module.client.presenters.PresenterProxyProcessingStep.generateProxy(PresenterProxyProcessingStep.java:66)
    at org.dominokit.domino.apt.client.processors.module.client.presenters.PresenterProxyProcessingStep.process(PresenterProxyProcessingStep.java:53)
    at org.dominokit.domino.apt.client.processors.module.client.presenters.PresenterProxyProcessor.process(PresenterProxyProcessor.java:61)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    at …
Run Code Online (Sandbox Code Playgroud)

java annotation-processing annotation-processor

5
推荐指数
1
解决办法
1230
查看次数