【问题标题】:GWT UI binder not seeing interface default methodsGWT UI binder 没有看到接口默认方法
【发布时间】:2017-08-11 10:00:22
【问题描述】:

我正在使用Dictionary 类来本地化我的应用程序,因为我希望我的文本是应用程序之外的文件,因此我可以更改它们而无需再次编译应用程序。

为了能够获取字符串,我创建了 StringIdentifiers 类,它具有以下所有方法:

public String minute(){
   return getString("minute");
}

getString() 方法基本上只是使用Dictionary 从包含在页面中的 JSON 中获取字符串。

然后我创建了名为 Language 的子类,在其中我有更多的逻辑(检查要使用的语言等)。这一切都完美无缺,我使用Language 子类来访问字符串。甚至在 UIBinder 中。

由于现在文本越来越多,我决定将这些方法拆分为单独的类。但是由于在 Java 中我不能进行多重继承,所以我决定通过接口来实现。因此,我创建了LoginTextsMenuTextsEventLogTexts 等接口,而不是StringIdentifiers。在这些接口中,我指定了default 方法来获取适当的字符串。 Language 类实现了所有接口以及getString() 方法。

现在一切正常,我得到了 Language 类的实例,我可以在代码中使用接口中的方法,没有错误。

但是当涉及到 UI 活页夹时,它不会在编辑器中显示错误,但在编译时它会告诉:

[错误] 在类型中找不到名为 minute 的无参数方法 com.company.project.client.locale.Language

这是否意味着 UI 绑定器无法从接口中看到继承的默认方法?真的吗?我的意思是在Java代码中,它工作正常。

【问题讨论】:

  • 这并不让我感到惊讶。我的意思是,GWT 中的 Java 1.8 支持(我的意思是完全支持)在某种程度上是一个新话题。并且考虑到 GWT 编译器依赖源代码这一事实,我认为默认方法被忽略并不奇怪(即使它在 Java 代码中工作)
  • 好吧,既然它在 Java 代码中工作,我认为只有 UIbinder 存在问题,但是是的,也许我想要的太多了。我想我将不得不找到另一种方法将方法拆分为单独的文件。也许再做一个接口类,并将它们作为语言类的属性。
  • 使用什么版本的GWT SDK? Release Notes中的默认方法有一些变化
  • 现在我使用的是 2.8.1,之前我想使用的是 2.8.0,但我现在使用类。我认为我的想法是我只会在任何地方包含 Language 类,然后可以访问所有文本,即使它们位于不同的文件/接口中。现在我使用所有从 Language 类继承 getString() 方法的类,如果我想使用任何文本,我注入正确的文本类(MenuTexts i> 例如)。
  • “所以不知道默认方法有没有进展” ...

标签: java gwt uibinder


【解决方案1】:

我遇到了同样的问题,但是,经过搜索,我发现了 Jos31fr 编写的这个巧妙的解决方法:https://github.com/gwtproject/gwt/issues/9629

  1. 定义接口,假设 GWT 支持默认方法。
  2. 在实现接口的类中,将默认方法重新定义为对超类的调用。
    导入 com.google.gwt.user.client.ui.TextBox;

    公共类 TestTextBox 扩展 TextBox 实现 TestInterface {
        公共无效setFoo(字符串栏){
            TestInterface.super.setFoo(bar);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2015-04-27
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多