2014-01-13 4 views
0

Есть ли способ принудительно использовать целочисленный тип с использованием LuaJava? Я пытаюсь в LuaJ 3.0 beta 1 (luaj-jse-3.0-beta1.jar) создать экземпляр java.awt.Color. Вы бы не подумали, что это будет такой проблемой, учитывая наличие Java API конструкторов (JavaAPI). Причина, по которой я заинтересован в форсировании целого числа в конструкторе, состоит в том, что доступные конструкторы Color принимают три и четыре аргумента либо int, либо float. Поскольку тип номера Lua равен double, LuaJ (или LuaJava) вызывает версии конструкторов float.Принудительно целочисленный тип в luajava

Сначала я подумал, что это не будет проблемой, но, пытаясь использовать его, я заметил, что получаю странствующий 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, без проблем, но в остальном это вызывает боль и страдания.

Мне немного любопытно узнать, столкнулся ли кто-нибудь с этой проблемой. Если это не решится, я свяжусь с PI в проекте LuaJ об этом и отчитаюсь.

В качестве побочного примечания: было бы просто построить решение, с помощью которого я использую пользовательскую Java-функцию, ответственную за создание Color. Я больше обеспокоен тем, что эта проблема существует, и есть ли какой-либо способ указать, какой конструктор вы хотите использовать, или явно указать LuaJava на использование целых чисел, а не на удвоение.

Update

Я также попытался использовать конструктор четыре-поплавок, и появляется та же самая проблема. Если я передаю одно из следующих значений: , конструктор работает правильно. Все остальное даст результат выше.

+0

Err, вы говорите, что хотите целочисленный тип, но по вашему примеру они уже конвертируются в целые числа, и это то, чего вы не хотите. –

+0

Это не преобразование в целое число, прежде чем оно будет передано конструктору. Выход I печатается из метода toString() «Цвет», который печатает целочисленное представление. Я знаю, что конструктор на основе float вызывается, потому что, если я попытаюсь передать целочисленные значения (диапазон от 0 до 255), я получу InvalidArgumentException, указав, что значения должны быть между 0 и 1. – Nathan

+0

О, так что вы хотите для вызова Color (int, int, int) вместо цвета по умолчанию (float, float, float). –

ответ

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 существует так много перегрузок, что он вызывает ошибку в логике выбора в luaj для чисел, значения поплавка и двойные значения которых немного отличаются (т. Е. .2).

Долгосрочный вариант может быть лучше, если luaj предоставляет механизм для получения определенных методов на основе их полных сигнатур вызовов, но, как и в случае с luaj-3.0-beta3, это выглядит как самый надежный способ вызвать перегрузку хотеть.

+0

Еще раз спасибо, Джим, за вашу помощь. Я продолжаю спотыкаться о странные проблемы, и вы будете с решениями. И еще раз спасибо за LuaJ. :) – Nathan

1

Вы можете заставить 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 использовать один из других перегруженных форм конструктора.

+0

Спасибо за этот ответ. Я технически хотел назвать три целых конструктора, но ваш метод прочен. Я чувствую себя глупо, что не думал об этом. – Nathan

Смежные вопросы