Java UiBinder:是否可以重写UiFactory方法?

Java UiBinder:是否可以重写UiFactory方法?,java,gwt,uibinder,Java,Gwt,Uibinder,在提出问题之前,我将简要描述一下上下文。 我有一个Widget类,它将ui实现“外包”给一个单独的类(如下所示): 实际的小部件类可以使用Ui类实例获取对特定子字段小部件/元素的引用: Ui ui; public SimpleFilmWidget() { this(new DefaultUi()); } public SimpleFilmWidget(Ui customUi) { assert customUi != null

在提出问题之前,我将简要描述一下上下文。 我有一个Widget类,它将ui实现“外包”给一个单独的类(如下所示):

实际的小部件类可以使用Ui类实例获取对特定子字段小部件/元素的引用:

    Ui ui;

    public SimpleFilmWidget() {
        this(new DefaultUi());
    }

    public SimpleFilmWidget(Ui customUi) {

        assert customUi != null : "UI should not be null!!!";

        ui = customUi;

        initWidget(ui.getMainPanel());
    }
我使用UiBinder提供了实际的UI实现,它使用UiFactory创建另一个复杂的子小部件

class DefaultUi implements Ui {

    //...

    @UiFactory
    protected VoteWidget createVoteWidget(){

        return new VoteWidget(msg){

            @Override
            protected SetVoteEvent onSetVote(Star star, boolean fireEvents) {
                return clientWidget.onSetVote(super.onSetVote(star, fireEvents));
            }
        };
    }
问题是: 当我提供DefaultUi的子类时,UiFactory方法能否在不混淆UiBinder解析器的子类中被重写

编辑:


UiFactory方法不应被重写,因为uibinder同时看到这两种方法(被重写和被重写),并与同一类型的两个UiFactory混淆:
[错误]VoteWidget类型的SimpleFilmWidget.DefaultUi类中存在重复工厂,我看不出有什么理由不可能:UiBinder查看公开的API,并调用传递给
createAndBindUi
的实际实例上的方法,这只是标准多态性

我看没有理由不可能:UiBinder查看公开的API,并在传递给
createAndBindUi
的实际实例上调用该方法,这只是标准的多态性

结论:

UiFactory方法不应被重写,因为uibinder同时看到这两种方法(被重写和被重写),并与同一类型的两个UiFactory混淆:
[ERROR]类SimpleFilmWidget.DefaultUi中重复工厂,用于VoteWidget类型。

从对@Thomas Broyer的评论: 我怀疑,它然后调用超类的UiFactory注释方法,这不是我想要它做的。我离开了这个问题,因为在这种情况下,变通的态度对我来说已经足够了

谢谢你的关心

结论:

UiFactory方法不应被重写,因为uibinder同时看到这两种方法(被重写和被重写),并与同一类型的两个UiFactory混淆:
[ERROR]类SimpleFilmWidget.DefaultUi中重复工厂,用于VoteWidget类型。

从对@Thomas Broyer的评论: 我怀疑,它然后调用超类的UiFactory注释方法,这不是我想要它做的。我离开了这个问题,因为在这种情况下,变通的态度对我来说已经足够了


谢谢你的关心

谢谢你的回答。我无法立即检查它是否有效,因为我进行了更大的重构,而项目目前还没有构建,所以我想确保我的重构是否正确。我今天会检查它是否有效。你能展示一下你试过的代码吗?(是的,生成器确实有可能不去复制重写的方法;但我读了你的问题,我觉得你不会面对这个问题)我只提到了第二个Ui类扩展了DefaultUi,没有附加一行代码。因此,有一个OldUi类扩展了DefaultUi-OldUi.createVoteWidget()覆盖DefaultUi.createVoteWidget(),因此ubinder为同一类型找到了两个uifactory方法(被覆盖的方法对uibinder仍然可见-我认为是反射api,但没有检查uibinder的源代码),这显然是一个错误。不幸的是,我不被允许为该项目发布有意义的部分源代码。但是
UiBinder
接口是使用
OldUi
声明的,而不是
DefaultUi
,对吗?因此,它不仅仅是调用
createAndBindUi
,使用一个子类的实例覆盖
@UiFactory
方法,该方法由
UiBinder
接口声明中使用的类定义(这里我不清楚)。在这种情况下,是的,似乎发电机中有一个bug。作为一种变通方法,您可以将
@UiFactory
设置为
final
,并将其委托给另一个可以重写的方法。那么,您可以吗?您是对的,OldUi类重写UiBinder模板接口和工厂方法,createAndBindUi在OldUi构造函数中被调用,以获得正确的UiBinder实例。但是,该项目没有使用最新的gwt版本。谢谢您的回答。我无法立即检查它是否有效,因为我进行了更大的重构,而项目目前还没有构建,所以我想确保我的重构是否正确。我今天会检查它是否有效。你能展示一下你试过的代码吗?(是的,生成器确实有可能不去复制重写的方法;但我读了你的问题,我觉得你不会面对这个问题)我只提到了第二个Ui类扩展了DefaultUi,没有附加一行代码。因此,有一个OldUi类扩展了DefaultUi-OldUi.createVoteWidget()覆盖DefaultUi.createVoteWidget(),因此ubinder为同一类型找到了两个uifactory方法(被覆盖的方法对uibinder仍然可见-我认为是反射api,但没有检查uibinder的源代码),这显然是一个错误。不幸的是,我不被允许为该项目发布有意义的部分源代码。但是
UiBinder
接口是使用
OldUi
声明的,而不是
DefaultUi
,对吗?因此,它不仅仅是调用
createAndBindUi
,使用一个子类的实例覆盖
@UiFactory
方法,该方法由
UiBinder
接口声明中使用的类定义(这里我不清楚)。在这种情况下,是的,似乎发电机中有一个bug。作为一种变通方法,您可以将
@UiFactory
设置为
final
,并将其委托给另一个可以重写的方法。那么,您可以吗?您是对的,OldUi类重写UiBinder模板接口和工厂方法,createAndBindUi在OldUi构造函数中被调用,以获得正确的UiBinder实例。但是,该项目不使用最新的gwt版本。
class DefaultUi implements Ui {

    //...

    @UiFactory
    protected VoteWidget createVoteWidget(){

        return new VoteWidget(msg){

            @Override
            protected SetVoteEvent onSetVote(Star star, boolean fireEvents) {
                return clientWidget.onSetVote(super.onSetVote(star, fireEvents));
            }
        };
    }