gpt4 book ai didi

java - 如何将对象转换为 JsType?

转载 作者:行者123 更新时间:2023-12-01 19:48:28 25 4
gpt4 key购买 nike

我声明了以下 JsType 以便操作 [GeoJson][1] 兼容数据:

@JsType
public class FeatureCollection extends GeoJson {

@JsProperty
private Feature[] features;

public FeatureCollection() {
super("FeatureCollection");
features = new Feature[]{};
}

public Feature[] getFeatures() {
return features;
}

有时我需要将我的 FeatureCollection 对象传递给外部库(例如 Turfs.js 以执行单位转换),这些库通过 features 属性访问数据。该库向我返回一个具有相同属性的新对象(它们像我的 JsType 一样遵循 GeoJson RFC),但我无法将其转换回 FeatureCollection:

FeatureCollection fc = new FeatureCollection();
Object o = TurfUtils.toWgs84(fc); // Works and give an object which respect the FeatureCollection scheme (ie an array of Features) when I print it on the javascript console.
FeatureCollection featureCollection = TurfUtils.toWgs84(fc); // Throw a java.lang.ClassCastException

Turf 库是 JsInteroped:

@JsType(isNative = true, namespace = GLOBAL, name = "turf")
public class TurfUtils {

public static native <T extends GeoJson> T toWgs84(T geojson);
}

当使我的FeatureCollection成为 native JsType时,它可以工作,但会阻止我使用当前的构造函数,因此我正在寻找一种将javascript对象强制转换为我的JsType的方法。[1]:https://www.rfc-editor.org/rfc/rfc7946

最佳答案

@JsType 和相关注释不会创建尝试理解您想要做什么的包装器,但它们实际上会生成尽可能接近地对应的 JS 代码你做了什么。这意味着,如果您说“我正在创建一个新的非本地 JS 类型,并且它将有一个像这样定义的构造函数”,GWT 会说“好的”并执行它。结果将是带有构造函数的 JS 类型,但根据定义,未使用该确切构造函数创建的对象不属于该类型,如果您尝试将它们视为该类型,则可能会收到错误。

相反,您的 FeatureCollection 几乎肯定应该是 native 类型,可能是 JsPackage.GLOBAL 命名空间中的普通 Object,而不是构造函数,你应该有一个工厂方法。

或者,您可以冒险使用 Js.uncheckedCast 来表示“相信我,这个对象或多或少是正确的形状(尽管它可能是错误的类型),只需像使用它一样使用它即可”是相同的类型”,只要 GWT 没有理由进一步进行类型检查,它就会让你逃脱惩罚。这可能适合在您自己的应用程序代码中使用,但对于您正在做什么以及何时会出错有非常清晰的注释。

<小时/>

旁注 - 一般来说,如果您在非本地 JsType 中有 getter 和 setter,您应该将它们标记为 @JsProperty 而不是标记私有(private)字段 - 如果你把这个字段设置为final,其他JS可能会稍后分配它,如果你让getter或setter做一些验证或缓存,任何来自JS的访问都会错过它。还要记住,如果类型是 JsType ,它将自动导出其所有公共(public)成员,因此您只需删除 JsProperty 和 getter 即可实现相同的效果,并将该字段公开。

关于java - 如何将对象转换为 JsType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52330845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com