LuaJ数组/列表类型安全性

所以使用LuaJ。

如果我从Java向Lua传递类型为T的userdata List<T>,Luaj仍然允许通过:add函数向该数组插入任何类型的对象。例如:

Java代码:

import java.util.ArrayList;
import org.luaj.vm2.Globals;
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
import org.luaj.vm2.lib.jse.JsePlatform;
import org.luaj.vm2.LuaValue;

ArrayList<Integer> ExampleList = new ArrayList<><Integer>();
ExampleList.add(1);
LuaValue[] LuaParams = new LuaValue[] {
    CoerceJavaToLua.coerce(ExampleList)
};

Globals globals = JsePlatform.standardGlobals();
try { globals.get("TestFunc").invoke(LuaValue.varargsOf(LuaParams)); }
catch(Exception e) {}

Lua:

function TestFunc(arr)
    arr:add("str")
    arr:add(2);
end

ExampleList的结果:

{
    new Integer(1),
    new String("str"), // 这是不允许的!
    new Integer(2)
}

由于ExampleList是一个List<Integer>,所以该字符串不应该被允许。

问题:有没有任何方法来保持类型安全呢?

如果需要进行测试,这里是将lua脚本添加到lua内存中的代码(就在try{}前):

globals.load(
    "function TestFunc(arr)\n"+
    "        arr:add(\"str\")\n"+
    "        arr:add(2);\n"+
    "end",
"ExampleScript").call();
点赞