Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gwt 在jsinterop中哪里可以找到LinkedHashSet?_Gwt_Linkedhashset_Gwt Jsinterop - Fatal编程技术网

Gwt 在jsinterop中哪里可以找到LinkedHashSet?

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

我在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;
   }

}
@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()
    toArray(t[])
    看起来与JS中的方法相同。GWT通过根本不支持第二种方法来解决这个问题。(
    java.util.List
    remove(T)
    remove(int)
    有相同的问题,但它在编译时通过将
    remove(int)
    重命名为
    removatendex(int)
    来解决此问题。)
如果您从未返回这些类型,您可能希望完全禁用此功能-编译器的
-excludeJsInteropExports
-includeJsInteropExports
标志允许您控制导出的内容


为了更直接地回答您的问题,我可以看到您有几个选择:

  • 允许从JS向
    setTexts
    方法传递其他内容,例如
    JsArrayLike
    ,这样您就可以让用户传递一个简单的JS字符串数组,甚至一个JS集合。您可以进一步接受
    对象
    ,然后键入check查看传入的内容。您甚至可以保留
    集合
    覆盖,以便在必要时从您自己的Java调用它,但将其标记为
    @JsIgnore
    ,以便在尝试导出重载方法时GWT不会中断
  • 在某处创建一个工厂方法,以创建希望JS用户使用的集合实现。由于支持
    add
    remove
    ,因此调用的JS代码可以在传入集合之前构建集合。大概是这样的:

    @JsMethod(namespace = "my.Util")
    public static <T> LinkedHashSet<T> createSet() {
      return new LinkedHashSet<>();
    }
    
    @JsMethod(namespace=“my.Util”)
    公共静态LinkedHashSet createSet(){
    返回新的LinkedHashSet();
    }
    
    现在,他们可以调用
    my.Util.createSet()
    ,附加项,然后将其传递给setTexts方法