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
Java 如何为@JsProperty设置默认值?_Java_Gwt_Gwt Jsinterop - Fatal编程技术网

Java 如何为@JsProperty设置默认值?

Java 如何为@JsProperty设置默认值?,java,gwt,gwt-jsinterop,Java,Gwt,Gwt Jsinterop,我正在为的源对象构建Jsinteropted包装器 我有一个抽象类Source,它嵌入了默认方法,比如获取/设置源代码的类型 @JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME) public class Source { @JsProperty protected final native String getType(); @JsProperty protected fina

我正在为的源对象构建Jsinteropted包装器

我有一个抽象类
Source
,它嵌入了默认方法,比如获取/设置源代码的类型

@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class Source {

    @JsProperty
    protected final native String getType();

    @JsProperty
    protected final native void setType(String type);

}
我有一个继承的类,它必须(根据Mapbbox文档)定义
类型
属性!所以我想做一些类似的事情:

@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class GeoJsonSource extends Source {

    @JsConstructor
    public GeoJson() {
        setType("geojson");
    }

}

但GWT编译器禁止这两种方法


现在,我使用一个工厂来创建GeoJsonSource,然后放置正确的
类型
属性,但我想知道是否有一种Jsinteropt方法可以做到这一点?

如何为其他人的类型设置默认值?你没有

记住,您已经告诉编译器您只是在描述js类对象——如果存在默认值,那么它们已经存在了

考虑一下如何在JS中实现这一点——通常这只是
{type:“geojson”}
var obj={};obj.type=“geojson”
执行以下两个必要步骤:a)创建普通对象,和b)指定默认情况下必须存在的类型

工厂可以工作,也许是GeoJsonSource中的一个静态方法,这样就可以清楚地知道您在做什么


另一个选项是不将GeoJsonSource类型标记为native,也不在全局名称空间中为其指定对象名称(即,不允许您重写其他人的数据),如果这适合您的用例。这将允许您控制类定义的默认值,在构造函数中添加逻辑等等,但是您必须确保正确导出方法

这种方法的局限性包括,从JSON字符串读取的任何对象都不是您的GeoJsonSource类型(但另一方面,这可能无关紧要,因为它可能已经具有
type
属性。但是,它的方法仍然缺少逻辑,因为从JSON读取总是创建普通的对象实例(除非将
恢复程序
函数传递给
JSON.parse()

类似地,从JS传递或从
JSON.parse()
读取的普通对象也不会正确地传递针对非本地类型的
instanceof
检查,这可能要求您在通常编写惯用Java的某些地方使用
JS.uncheckedCast



因为您正在构建一个包装器(可能会被其他人使用,他们可能不一定像您一样完全理解这些限制),我倾向于使用工厂方法-是的,它需要在您这方面进行更多的设置,但在纯JS中,您的要求更清晰,如果有人将纯JS对象视为Java GeoJsonSource(因为它是一个),它的行为将更可预测。

如何为其他人的类型设置默认值?您没有

记住,您已经告诉编译器您只是在描述js类对象——如果存在默认值,那么它们已经存在了

考虑一下在JS中是如何做到这一点的——通常这只是
{type:“geojson”}
var obj={};obj.type=“geojson”
来完成两个必要的步骤:a)创建一个普通对象,和b)分配一些默认情况下必须存在的类型

工厂可以工作,也许是GeoJsonSource中的一个静态方法,这样就可以清楚地知道您在做什么


另一个选项是不将GeoJsonSource类型标记为native,也不在全局名称空间中为其指定对象名称(即,不允许您重写其他人的数据),如果这适合您的用例。这将允许您控制类定义的默认值,在构造函数中添加逻辑等等,但是您必须确保正确导出方法

这种方法的局限性包括,从JSON字符串读取的任何对象都不是您的GeoJsonSource类型(但另一方面,这可能无关紧要,因为它可能已经具有
type
属性。但是,它的方法仍然缺少逻辑,因为从JSON读取总是创建普通的对象实例(除非将
恢复程序
函数传递给
JSON.parse()

类似地,从JS传递或从
JSON.parse()
读取的普通对象也不会正确地传递针对非本地类型的
instanceof
检查,这可能要求您在通常编写惯用Java的某些地方使用
JS.uncheckedCast


因为您正在构建一个包装器(可能会被其他人使用,他们可能不一定像您一样完全理解这些限制),我倾向于使用工厂方法-是的,它需要在您这方面进行更多的设置,但在普通JS中,您的要求更加明确,如果有人将普通JS对象视为Java GeoJsonSource(因为它是一个),那么它的行为将更加可预测

@JsType(isNative = true, namespace = GLOBAL, name = JS_OBJECT_NAME)
public class GeoJsonSource extends Source {

    @JsProperty
    private String type = "geojson";

}