是否有任何方法强制使用LuaJava的整数类型?我试图在LuaJ 3.0 beta 1 (luaj-jse-3.0-beta1.jar)中创建一个java.awt.Color实例。考虑到构造函数的Java可用性(JavaAPI),您不会认为这是一个问题。我之所以对强制构造函数使用整数感兴趣,是因为可用的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,并报告。
顺便提一句:构建一个解决方案将是一个简单的事情,通过这个解决方案,我将使用一个定制的Color函数来负责创建。我更担心这个问题的存在,以及是否有某种方式指定要使用哪个构造函数,或者显式地告诉LuaJava使用整数,而不是双倍。
更新
我也尝试使用四浮动构造函数,也出现了同样的问题。如果我传入以下值之一:alpha=0, 0.5, 1,构造函数将正确运行。其他任何事情都会产生上述结果。
发布于 2014-01-15 16:41:20
函数math.floor()和math.ceil()四舍五入,总是产生一个整数。
对于java.awt.Color,使用单整数构造函数可能更好,因为没有浮点等效函数。这样,每次都会选择相同的构造函数。
下面是一个有用的例子:
-- 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类,有太多的重载,以至于它在luaj中的选择逻辑中触发了一个错误,用于那些浮点数和双值略有不同的数字(即.2)。
长期而言,如果luaj公开一种基于其完全调用签名获取特定方法的机制,可能会更好,但从luaj-3.0-beta3开始,这似乎是调用所需重载的最可靠方式。
发布于 2014-01-15 17:14:13
您可以强制luaj使用3个浮动构造函数,如下所示:
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使用其他重载的构造函数表单之一。
https://stackoverflow.com/questions/21084563
复制相似问题