0

有没有办法使用 LuaJava 强制整数类型?我正在尝试在 LuaJ 3.0 beta 1(luaj-jse-3.0-beta1.jar)中创建一个java.awt.Color. 考虑到构造函数 ( JavaAPI )的 Java API 可用性,您不会认为这是一个问题。我对将整数强制放入构造函数感兴趣的原因是Color可用的构造函数采用intor的三个和四个参数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给这个构造函数,然后 print j_color,我会看到

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

在输出中。事实上,我可以使用任何我想要的东西rg只要b = 0,没有问题,但否则,它会导致痛苦和痛苦。

我有点好奇是否有其他人遇到过这个问题。如果不能解决,我会联系 LuaJ 项目的 PI 并报告。

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

更新

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

4

2 回答 2

1

函数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 Color 类,有太多的重载会触发 luaj 中选择逻辑中的错误,因为它的浮点值和双精度值略有不同(即 0.2)。

从长远来看,如果 luaj 公开一种基于其完整调用签名获取特定方法的机制可能会更好,但从 luaj-3.0-beta3 开始,这似乎是调用所需重载的最可靠方法。

于 2014-01-15T16:41:20.593 回答
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 使用其他重载构造函数形式之一的操作。

于 2014-01-15T17:14:13.020 回答