在luajava中强制使用整数类型。

有没有办法在LuaJava中强制使用整数类型?我正在尝试在LuaJ 3.0 beta 1(luaj-jse-3.0-beta1.jar)中创建java.awt.Color的实例。鉴于Java API提供了构造函数([JavaAPI](http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html),您不会认为这会成为一个问题。我有兴趣强制将整数传递给构造函数的原因是可用的`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.0g = 0.2b = 0.2 传递给此构造函数,然后打印 j_color,我会看到

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

在输出中。实际上,只要 b = 0,我可以使用任何我想要的 rg,没有任何问题,但是如果这不是这样,它将引起痛苦。

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

顺便说一句:通过构建使用自定义Java函数负责创建Color的解决方案将是一件简单的事情。我更担心存在这个问题,以及是否有某种方法来指定要使用的构造函数,或者显式告诉LuaJava使用整数而不是双精度数。

更新

我还尝试使用四个浮点数构造函数,同样的问题出现了。如果我传递以下值之一:alpha = 0,0.5,1,则构造函数将正常工作。其他任何内容都会产生上面的结果。

点赞
用户2556943
用户2556943

Lua 中的数值类型问题

函数 math.floor()math.ceil() 用于数值的向下取整和向上取整,并始终生成整数值。

对于 java.awt.Color,最好使用单个整数构造函数,因为没有相应的浮点型构造函数。这样同样的构造函数将在每一次选择时都被使用。

以下是一个可行的样例:

-- 返回由浮点值 r、g、b 组成的 Java Color,范围在 [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

然后,你提供的错误案例将会有预期的结果:

-- 测试样例
print( color(1, .2, .2) )

> java.awt.Color[r=255,g=51,b=51]

问题在于基于数值类型的重载函数在运行时的选择问题。对于 java Color 类,存在如此多的重载函数,以至于当浮点型和双精度值稍有差别(例如 .2)时,这会在 luaj 中触发选择逻辑的错误。

长期来看,如果 luaj 能够公开使用特定函数完整调用签名的机制,那么这将是更可靠的一种调用所需重载函数的方法。但在 luaj-3.0-beta3 中,以上是目前最可靠的方法。

2014-01-15 16:41:20
用户2279620
用户2279620

你可以强制Luaj使用三个浮点数的构造函数,如下所示:

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使用其他重载的构造函数形式。

2014-01-15 17:14:13