注释处理器似乎破坏了 Java 泛型背景问题
背景
我试图使用注释处理器来生成特定工厂接口的实现。这些接口如下所示:
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);
}
考虑到用户想知道,将返回哪个视图以及需要哪个演示者,这根本不起作用。我本来以为:
- 两个自动生成的文件都是错误的
- 或两者都是正确的
因为它们都非常相似。我以为第一个是真的。
我在这里错过了什么?
如果我将泛型类型添加到 TestViewImplFactory 中,如下所示:
public final class TestViewImplFactory implements ViewFactory<TestView> {
@Override
public <S extends Presenter<TestView>> TestView create(S presenter) {
return new TestViewImpl(presenter);
}
}
问题出现了,构造函数参数(属于类型测试预感器)不正确。将 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中,在方法和类型声明中)?