背景
我尝试使用注解处理器来生成特定工厂接口的实现。这些接口如下所示:
public interface ViewFactory<T extends View> {
<S extends Presenter<T>> T create(S presenter);
}
并且
public interface PresenterFactory<T extends View> {
<S extends Presenter<T>> S create();
}
注解处理器正在执行正确的操作,并为每个带有相应注解的匹配类生成工厂。
问题
注解处理器的输出如下:
public final class TestViewImplFactory implements ViewFactory {
public final TestView create(TestPresenter presenter) {
return new TestViewImpl(presenter);
}
}
和相应的另一个类:
public final class TestPresenterImplFactory implements PresenterFactory {
public final TestPresenter create() {
return new TestPresenterImpl();
}
}
然而,TestViewImplFactory无法编译。错误信息如下:
"类'TestViewImplFactory'必须声明为抽象或实现'ViewFactory'中的抽象方法create(S)"
Java指出,以下内容是正确的:
@Override
public View create(Presenter presenter) {
return new TestViewImpl(presenter);
}
考虑到用户想要知道返回哪个视图和需要哪个Presenter,这种方法根本行不通。我原本希望:
- 自动生成的文件中要么两个都是错误的
- 要么两个都是正确的
因为它们非常相似,我本以为第一种情况是正确的。
我错过了什么吗?
如果我像这样将泛型类型添加到TestViewImplFactory中:
public final class TestViewImplFactory implements ViewFactory<TestView> {
@Override
public <S extends Presenter<TestView>> TestView create(S presenter) {
return new TestViewImpl(presenter);
}
}
问题在于,构造函数参数(类型为TestPresenter)不正确。将S更改为具体的TestPresenter会使该类出现与上述相同的编译错误。
因此,我找到了一个可以编译的“解决方案”。
基本上需要做的是将ViewFactory接口更改为以下内容:
public interface ViewFactory<T extends View, S extends Presenter<T>> {
T create(S presenter);
}
因此,类定义具有与上述问题中的方法相同的泛型类型。
编译后(这次是具有泛型类型规范),输出如下:
public final class TestViewImplFactory implements ViewFactory<TestView, TestPresenter> {
public TestViewImplFactory() {
}
public final TestView create(TestPresenter presenter) {
return new TestViewImpl(presenter);
}
}
这段代码可以被编译并且成功运行。
然而,这并没有回答原来的问题。为什么在类型定义中明确指定泛型是正确的,但在方法声明中继承和指定泛型是错误的,并且无法编译?
具体地说:为什么 Java 能够自动继承一个泛型(在 PresenterFactory 中),而不能自动继承其他泛型(在 ViewFactory、方法和类型声明中)?