如何在LuaJ中将List作为函数参数传入?
解决Lua调用Java List时的"bad argument: table expected, got userdata"错误
问题根源
Java的List对象通过Lua-Java桥接层传递到Lua时,不会自动转为Lua原生的table类型,而是以userdata形式存在。而ipairs仅支持遍历Lua原生table,因此触发类型错误。
解决方案
方案1:Java端主动转换List为Lua Table
以LuaJ框架为例,手动将Java List转换为Lua table后再传递:
import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.CoerceJavaToLua; // 调用时转换List List<?> yourList = ...; LuaValue luaTable = CoerceJavaToLua.coerce(yourList); // 将luaTable传入Lua函数执行
如果需要自定义转换逻辑,也可以手动构建table:
public LuaValue listToLuaTable(List<?> list) { LuaValue table = LuaValue.tableOf(); for (int i = 0; i < list.size(); i++) { // 根据元素类型做对应转换,这里以字符串为例 table.set(i + 1, LuaValue.valueOf(list.get(i).toString())); } return table; }
方案2:Lua端适配处理Java List的userdata
直接在Lua函数中兼容Java List的userdata,利用桥接层暴露的Java方法遍历:
testFunction = function(listIn) local listType = type(listIn) -- 处理Java List的userdata:调用其size()和get()方法 if listType == "userdata" and listIn.size and listIn.get then local len = listIn:size() for i = 1, len do print(i) -- 如需获取元素:local obj = listIn:get(i - 1) (Java List是0索引) end -- 兼容原生Lua table的情况 elseif listType == "table" then for i, obj in ipairs(listIn) do print(i) end else error("invalid argument type: expected table or Java List userdata") end end
方案3:配置桥接框架自动转换
部分Lua-Java桥接框架支持自动类型转换,比如LuaJ可以通过配置默认转换器,让Java集合自动转为Lua table,无需手动转换。
内容的提问来源于stack exchange,提问作者Wolfsurge
相关产品推荐
相关产品推荐

