强制luajava中的整数类型

时间:2014-01-13 05:40:24

标签: lua luajava luaj

有没有办法使用LuaJava强制整数类型?我正在尝试在LuaJ 3.0 beta 1 (luaj-jse-3.0-beta1.jar)中创建java.awt.Color的实例。考虑到构造函数(JavaAPI)的Java API可用性,您不会认为这会是一个问题。我有兴趣将整数强制转换为构造函数的原因是Color构造函数可以使用intfloat的三个和四个参数。由于Lua的数字类型为double,因此LuaJ(或LuaJava)调用构造函数的float版本。

起初,我认为这不会是一个问题,但在尝试使用它之后,我注意到我收到了一个错误的Color。这些值没有被正确地传递到构造函数中,并且Color对象基本上被破坏了,没有可识别的错误(它没有崩溃任何东西,它只是没有显示)。

这是一个简单的例子:

local j_color = luajava.newInstance( "java.awt.Color", r, g, b );
print( j_color );

如果我将r = 1.0g = 0.2b = 0.2传递给此构造函数,然后打印j_color,我会看到

java.awt.Color[r=0,g=0,b=1]

在输出中。事实上,我可以在rg中使用我想要的任何内容,只要b = 0,没有任何问题,但除此之外,它会导致痛苦和痛苦。

我有点好奇知道是否有其他人遇到过这个问题。如果它没有解决,我将联系LuaJ项目的PI,并报告回来。

作为旁注:构建一个解决方案是一件简单的事情,我使用定制的Java函数来负责创建Color。我更担心这个问题是否存在,以及是否有某种方法要么指定要使用哪个构造函数,要么明确告诉LuaJava使用整数而不是双精度。

更新

我也试图使用四浮点构造函数,并出现同样的问题。如果我传入以下值之一:alpha=0, 0.5, 1构造函数正常运行。其他任何东西都会产生上述结果。

2 个答案:

答案 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使用其他重载构造函数表单的操作。