不支持的可扩展类型:java.lang.Boolean

编程语言 2026-07-08

请看下面的示例程序:

uses java.nio.file.*
uses dynamic.Dynamic
uses javax.script.Bindings
uses gw.util.GosuEscapeUtil
uses gw.lang.reflect.json.Json
uses gw.lang.reflect.EmptyBindings

var jsonText : String
var jsonParsed : Bindings
var SETTING_NAME : String = "editor.guides.indentation"
var PATH_TO_SETTINGS : String = "C:\\Users\\Kamil Kurkiewicz\\AppData\\Roaming\\Code\\User\\settings.json"
                              // Bonus Question: Why cannot the two strings be defined as final?

jsonText = Files.readString(Path.of(PATH_TO_SETTINGS))
jsonParsed = Json.fromJson(jsonText)

// If the indent guides are expressly declared not to
// be rendered (which is not the default behavior), remove the setting entirely.
if (jsonParsed.get(SETTING_NAME) == false) {
  jsonParsed.remove(SETTING_NAME)
}

// If the setting is not there (which implies the default
// value of true), or the value is needlessly set to true, set it to false.
else {
  jsonParsed.put(SETTING_NAME, false)
}

//Files.writeString(Path.of(PATH_TO_SETTINGS), jsonParsed.toJson())
print(jsonParsed.toJson())

带有print语句的这一行会导致以下运行时错误:

java.lang.IllegalStateException: Unsupported expando type: class java.lang.Boolean
    at gw.lang.enhancements.CoreBindingsEnhancement.appendGosuValue(CoreBindingsEnhancement.gsx:264)
    at gw.lang.enhancements.CoreBindingsEnhancement.toJson(CoreBindingsEnhancement.gsx:54)
    at gw.lang.enhancements.CoreBindingsEnhancement.toJson(CoreBindingsEnhancement.gsx:29)
    at _nopackage_.GosuScratchpad.evaluate(Unknown Source)
    at gw.internal.gosu.parser.GosuProgram.runProgram(GosuProgram.java:455)
    at gw.internal.gosu.parser.GosuProgram.evaluate(GosuProgram.java:270)
    at gw.internal.gosu.parser.GosuProgram_Proxy.evaluate(gw.internal.gosu.parser.GosuProgram_Proxy:2)
    at gw.internal.gosu.parser.ExecutionEnvironment$1.evaluate(ExecutionEnvironment.java:685)
    at gw.internal.gosu.parser.ExecutionEnvironment$1.runScript(ExecutionEnvironment.java:658)
    at gw.internal.gosu.parser.ExecutionEnvironment$1.run(ExecutionEnvironment.java:624)
    at java.base/java.lang.Thread.run(Thread.java:829)

toJson() 方法的调用失败,因为在将解析树的后续节点转换回字符串时,appendGosuValue() 子例程甚至都不把 Boolean 视为受支持的expando类型。然而,Boolean 是八种标准包装类型中唯一以这种方式对待的。我的问题是:这是有意为之,还是存在一个错误?

解决方案

动态Expando对象是Gosu中极少使用的特性之一,因此我也不打算花太多时间去弄清楚这个问题。只使用True与 False的字符串表示即可。

我记得大约五年多前就遇到过这个问题,当时我也无法让布尔包装类与toJson函数一起工作。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章