有没有办法使用LuaJava强制整数类型?我正在尝试在LuaJ 3.0 beta 1 (luaj-jse-3.0-beta1.jar)
中创建java.awt.Color
的实例。考虑到构造函数(JavaAPI)的Java API可用性,您不会认为这会是一个问题。我有兴趣将整数强制转换为构造函数的原因是Color
构造函数可以使用int
或float
的三个和四个参数。由于Lua的数字类型为double
,因此LuaJ(或LuaJava)调用构造函数的float
版本。
起初,我认为这不会是一个问题,但在尝试使用它之后,我注意到我收到了一个错误的Color
。这些值没有被正确地传递到构造函数中,并且Color
对象基本上被破坏了,没有可识别的错误(它没有崩溃任何东西,它只是没有显示)。
这是一个简单的例子:
local j_color = luajava.newInstance( "java.awt.Color", r, g, b );
print( j_color );
如果我将r = 1.0
,g = 0.2
,b = 0.2
传递给此构造函数,然后打印j_color
,我会看到
java.awt.Color[r=0,g=0,b=1]
在输出中。事实上,我可以在r
和g
中使用我想要的任何内容,只要b = 0
,没有任何问题,但除此之外,它会导致痛苦和痛苦。
我有点好奇知道是否有其他人遇到过这个问题。如果它没有解决,我将联系LuaJ项目的PI,并报告回来。
作为旁注:构建一个解决方案是一件简单的事情,我使用定制的Java函数来负责创建Color
。我更担心这个问题是否存在,以及是否有某种方法要么指定要使用哪个构造函数,要么明确告诉LuaJava使用整数而不是双精度。
更新
我也试图使用四浮点构造函数,并出现同样的问题。如果我传入以下值之一:alpha=0, 0.5, 1
构造函数正常运行。其他任何东西都会产生上述结果。
答案 0 :(得分:1)
函数math.floor()和math.ceil()向下和向上舍入并始终生成整数。
对于java.awt.Color,最好使用单整数构造函数,因为没有float等价物。这样每次都会选择相同的构造函数。
这是一个有效的例子:
-- return Java Color with r, g, b as floats in range [0,1]
function color(r, g, b)
local ir = math.floor(r * 255)
local ig = math.floor(g * 255)
local ib = math.floor(b * 255)
local packed_rgb = ir*(256*256) + ig*256 + ib
return luajava.newInstance("java.awt.Color", packed_rgb)
end
您提供的失败案例将具有预期结果:
-- test the example
print( color(1, .2, .2) )
> java.awt.Color[r=255,g=51,b=51]
问题在于运行时基于数字类型选择重载函数。对于java Color类,有很多重载,它会在luaj中的选择逻辑中触发浮点数和double值略有不同的数字(即.2)。
长期来看,如果luaj基于其完整的调用签名公开一种获取特定方法的机制可能会更好,但是从luaj-3.0-beta3开始,这看起来是调用你想要的重载的最可靠方法
答案 1 :(得分:1)
您可以强制luaj使用3 float构造函数,如下所示:
function color(r,g,b)
r = luajava.newInstance("java.lang.Float",r)
g = luajava.newInstance("java.lang.Float",g)
b = luajava.newInstance("java.lang.Float",b)
return luajava.newInstance("java.awt.Color",r,g,b)
end
当然,您可以执行类似强制luaj使用其他重载构造函数表单的操作。