Gwt 在jsinterop中哪里可以找到LinkedHashSet?
我在GWT中有以下实体Gwt 在jsinterop中哪里可以找到LinkedHashSet?,gwt,linkedhashset,gwt-jsinterop,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
@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;
}
}
@JsType(namespace=“my.entities”)
公共类MyEntity{
专用文本;
公共集getTexts(){
if(this.text==null)
this.text=new LinkedHashSet();
返回此文本;
}
公共无效设置文本(设置文本){
这个。文本=文本;
}
}
在Javascript中调用myEntityVar.getTexts()
时,返回的对象是HashSet。jsinterop似乎将HashSet的java实现转换为JavaScript。但是如何在JavaScript中创建一个新的HashSet来使用myEntityVar.setTexts(text)
?我为“text”参数尝试了一个数组,但不起作用。所以我需要在JavaScript中使用HashSet。
然而,我不知道在哪里可以找到它。
有什么想法吗?简单的回答是你不能——但是,同样,你也不能在JS中创建一个普通的哈希集 这一切之所以有效,是因为您启用了
-generateJsInteropExports
,虽然在MyEntity
类型上有一个JsInterop注释,但在java.util.Set
上也有一个注释(以及其他一些基本JRE类型)。这允许您的代码返回模拟的java集而不会出现问题-支持与在JS中运行兼容的任何方法
有几个缺点:
- 编译大小有所增加,因为即使您不使用方法,也必须以这种方式将其编译到您的应用程序中,以防JS使用它
- 有些方法不受支持-JS实际上没有方法重载,因此
和toArray()
看起来与JS中的方法相同。GWT通过根本不支持第二种方法来解决这个问题。(toArray(t[])
与java.util.List
和remove(T)
有相同的问题,但它在编译时通过将remove(int)
重命名为remove(int)
来解决此问题。)removatendex(int)
-excludeJsInteropExports
和-includeJsInteropExports
标志允许您控制导出的内容
为了更直接地回答您的问题,我可以看到您有几个选择:
- 允许从JS向
方法传递其他内容,例如setTexts
,这样您就可以让用户传递一个简单的JS字符串数组,甚至一个JS集合。您可以进一步接受JsArrayLike
,然后键入check查看传入的内容。您甚至可以保留对象
覆盖,以便在必要时从您自己的Java调用它,但将其标记为集合
,以便在尝试导出重载方法时GWT不会中断@JsIgnore
- 在某处创建一个工厂方法,以创建希望JS用户使用的集合实现。由于支持
和add
,因此调用的JS代码可以在传入集合之前构建集合。大概是这样的:remove
@JsMethod(namespace = "my.Util") public static <T> LinkedHashSet<T> createSet() { return new LinkedHashSet<>(); }
现在,他们可以调用@JsMethod(namespace=“my.Util”) 公共静态LinkedHashSet createSet(){ 返回新的LinkedHashSet(); }
,附加项,然后将其传递给setTexts方法my.Util.createSet()