小编Tho*_*uck的帖子

注释处理器似乎打破了Java泛型

背景

我试图使用Annotation Processors来生成特定Factory接口的实现.这些接口看起来如下:

public interface ViewFactory<T extends View> {

    <S extends Presenter<T>> T create(S presenter);

}
Run Code Online (Sandbox Code Playgroud)

public interface PresenterFactory<T extends View> {

    <S extends Presenter<T>> S create();

}
Run Code Online (Sandbox Code Playgroud)

Annotation Processor正在执行正确的操作,并为每个匹配的类生成一个工厂,该工厂使用相应的注释进行注释.

问题

注释处理器的输出如下:

public final class TestViewImplFactory implements ViewFactory {

    public final TestView create(TestPresenter presenter) {
        return new TestViewImpl(presenter);
    }
}
Run Code Online (Sandbox Code Playgroud)

和相应的其他类:

public final class TestPresenterImplFactory implements PresenterFactory {

    public final TestPresenter create() {
        return new TestPresenterImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,TestViewImplFactory无法编译.错误消息是:

"类'TestViewImplFactory'必须声明为abstract或在'ViewFactory'中实现抽象方法create(S)"

Java说,以下是正确的:

@Override
public View create(Presenter presenter) {
    return new …
Run Code Online (Sandbox Code Playgroud)

java generics annotations annotation-processing

20
推荐指数
1
解决办法
763
查看次数

避免在基于工厂的通用MVP框架中进行转换

我试图在MVP模式中实现一种将View和Presenter分离的方法,以提供一个框架,这正是这样做的,但在一点之后我感到困惑.

背景

我有一个View接口,其中包含连接的演示者的泛型类型,反之亦然.这些接口将由实现开发人员扩展.具体的界面对这个问题不感兴趣,但这些界面的类定义如下所示:

public interface Presenter<T extends View>
Run Code Online (Sandbox Code Playgroud)

public interface View<T extends Presenter>
Run Code Online (Sandbox Code Playgroud)

这个想法是View和Presenter都知道对立的界面.

对于使用此结构,开发人员应提供工厂,实例化他想要显示的视图和处理此视图的Presenter.他把它们都给了一个名为SuperController的类.它们与View的类相关联.

创建Presenter的PresenterFactory接口没有参数,并返回Presenter实现,并查看以下内容:

public interface PresenterFactory<T extends View> {

    <S extends Presenter<T>> S create();

}
Run Code Online (Sandbox Code Playgroud)

创建View的ViewFactory接口基于Presenter创建View实现,并查看以下内容:

public interface ViewFactory<T extends View, S extends Presenter<T>> {

    T create(S presenter);

}
Run Code Online (Sandbox Code Playgroud)

问题

我遇到的问题如下:

我想提供一个TestView和TestPresenter的示例.那些看起来像这样:

public interface TestPresenter extends Presenter<TestView> {...}

public interface TestView extends View<TestPresenter> {...}
Run Code Online (Sandbox Code Playgroud)

此外,还提供了ViewFactory,如下所示:

class TestViewFactory implements ViewFactory<TestView, TestPresenter> {

    @Override
    public TestView create(TestPresenter presenter) {
        return new TestViewImpl(presenter);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是TestPresenterFactory:

private class TestPresenterFactory …
Run Code Online (Sandbox Code Playgroud)

java generics mvp software-design

7
推荐指数
1
解决办法
340
查看次数

将Spring集成到现有的Guice项目中,并从Guice中获取bean

我正在尝试开发一个服务器端应用程序,该应用程序可以管理事物(我不想详细介绍)。

该应用程序分为几个模块。这些包括但不限于:

  • 网络通讯
  • 资料存取
  • 数据查询
  • 集成UI

所有上述模块都是解耦的,最上面的模块是IntegratedWebUI(集成UI)。所有模块仅公开接口,并且使用Guice IOC将这些接口连接在一起。

对于集成的UI,我想使用Spring。我知道,Spring附带了一个IOC容器,但我不希望其他模块了解Spring,以使其更具可互换性(就像更改它,而不接触其他模块)。

我的具体问题:以Spring试图从Guice注射器中取出豆子的方式,将Spring钩在Guice上是最优雅的方法吗?


我已经知道春天的果汁,某种程度上类似于这样。但是,我想完全取消IntegratedWebUI的耦合,并且永远不要更改WebUI模块内部的配置(因此,Guice注入器),即,通过更改guice模块的配置来更改行为。

在spring-guice的示例中,提供的钩子仅创建具体的Object,但是我希望能够告诉Spring:“尝试从Guice创建任何对象”(例如使用通用方法,这似乎是不可行的)。这样有什么可能吗?

Spring和Guice似乎都使用JSR330。是否可以编写一些通过Spring实例化并使用javax.inject。@ Inject从使用Guice连接的其他模块的依赖关系的Spring Controller?

java spring guice spring-boot

5
推荐指数
0
解决办法
370
查看次数