Rinoceronte, tipo de confusão e autoboxing
-
27-09-2019 - |
Pergunta
Em uma extensão lateral do servidor para o SmartFoxServer (que usa rinoceronte), eu tinha um pedaço de JavaScript semelhante a este:
response["xpos"] = properties.get("xpos");
send(JSON.stringify(response));
Isso causou erros. O que aconteceu? Porque as propriedades são um java Map
, quando um número é colocado nele, ele é autoboxado em um java.lang.Double
objeto. Portanto, ao recuperá -lo e armazená -lo em response["xpos"]
, o resultado não é um número regular de javascript, mas um JavaObject
do tipo java.lang.Double
. o JSON.stringify
A função não foi feita para lidar com isso e travou.
Eu consertei com um hack como este:
response["xpos"] = 1.0 * properties.get("xpos");
send(JSON.stringify(response));
Existe uma maneira melhor?
Solução
Você pode usar Number(properties.get("xpos"))
, como na seguinte sessão de console interativo:
js> x=java.lang.Double(2)
2.0
js> typeof x
object
js> x instanceof java.lang.Double
true
js> y=Number(x)
2
js> typeof y
number
É assim que as cordas são tipicamente convertidas em rinoceronte de java.lang.string em strings nativos de JavaScript também.