haf*_*ues 0 gwt linkedhashset gwt-jsinterop
我在GWT中有以下实体
@JsType(namespace = "my.entities")
public class MyEntity {
private Set<String> texts;
public Set<String> getTexts(){
if(this.texts==null)
this.texts=new LinkedHashSet<String>();
return this.texts;
}
public void setTexts(Set<String> texts){
this.texts=texts;
}
}
Run Code Online (Sandbox Code Playgroud)
当我myEntityVar.getTexts()用Java语言调用时,返回的对象是HashSet。似乎jsinterop将HashSet的java实现转换为JavaScript。但是如何使用JavaScript创建新的HashSet myEntityVar.setTexts(texts)呢?我为“文本”参数尝试了一个数组,但这不起作用。因此,我需要以某种方式在JavaScript中使用HashSet。但是,我不知道在哪里找到它。任何的想法?
简短的答案是,您不能-但是再一次,您也不能在JS中创建普通的HashSet!
之所以完全有效,是因为您已启用-generateJsInteropExports,并且您的MyEntity类型上有一个JsInterop批注,但同时也有一个java.util.Set(和其他一些基本的JRE类型)。这使您的代码可以毫无问题地返回仿真的Java集-支持与JS中运行兼容的任何方法。
有一些缺点:
toArray()和toArray(T[])样子在JS同样的方法。GWT通过完全不支持第二种方法来解决此问题。(java.util.List与remove(T)和存在相同的问题remove(int),但是它通过重命名remove(int)为removeAtIndex(int)编译时来解决。)如果您从不返回这些类型,则可能要完全禁用此功能- 编译器的-excludeJsInteropExports和-includeJsInteropExports标志可让您控制导出的内容。
为了更直接地回答您的问题,您可以选择以下几种方法:
setTexts方法从JS传递其他内容,例如,JsArrayLike这样您就可以让用户传递普通的JS字符串数组,甚至是JS Set。您可以走得更远并接受Object,然后对它进行类型检查以查看传入的内容。您甚至可以保留Set覆盖,以便可以在必要时从您自己的Java调用它,但是将其标记为@JsIgnore在以下情况下GWT不会中断您尝试导出重载方法。在某处创建一个工厂方法来创建您希望JS用户使用的Set实现。由于add和remove都受支持,因此调用JS代码可以在传入之前先建立集合。
@JsMethod(namespace = "my.Util")
public static <T> LinkedHashSet<T> createSet() {
return new LinkedHashSet<>();
}
Run Code Online (Sandbox Code Playgroud)
现在,他们可以调用my.Util.createSet(),追加项目,然后将其传递给您的setTexts方法。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |