首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制luajava中的整数类型。

强制luajava中的整数类型。
EN

Stack Overflow用户
提问于 2014-01-13 05:40:23
回答 2查看 489关注 0票数 0

是否有任何方法强制使用LuaJava的整数类型?我试图在LuaJ 3.0 beta 1 (luaj-jse-3.0-beta1.jar)中创建一个java.awt.Color实例。考虑到构造函数的Java可用性(JavaAPI),您不会认为这是一个问题。我之所以对强制构造函数使用整数感兴趣,是因为可用的Color构造函数使用intfloat的三个和四个参数。因为Lua的数字类型是double,所以LuaJ (或LuaJava)调用构造函数的float版本。

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

下面是一个简单的例子:

代码语言:javascript
复制
local j_color = luajava.newInstance( "java.awt.Color", r, g, b );
print( j_color );

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

代码语言:javascript
复制
java.awt.Color[r=0,g=0,b=1]

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

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

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

更新

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-15 16:41:20

函数math.floor()math.ceil()四舍五入,总是产生一个整数。

对于java.awt.Color,使用单整数构造函数可能更好,因为没有浮点等效函数。这样,每次都会选择相同的构造函数。

下面是一个有用的例子:

代码语言:javascript
复制
-- 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

然后,您提供的失败案例将产生预期的结果:

代码语言:javascript
复制
-- 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开始,这似乎是调用所需重载的最可靠方式。

票数 1
EN

Stack Overflow用户

发布于 2014-01-15 17:14:13

您可以强制luaj使用3个浮动构造函数,如下所示:

代码语言:javascript
复制
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使用其他重载的构造函数表单之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21084563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档