如何从Ballerina向Java函数传递Java Map及类型转换问题
问题描述
需要将Ballerina的map<string>转换为Java的javautil:Map,以便传递给Java函数。当前实现中遇到两处TypeCastingErrors:
- 尝试用
ensureType将Ballerinastring转为javalang:Object时失败 - 用
java:cast将javautil:HashMap转为javautil:Map时报错
原实现代码:
javautil:Map? javaMap = balMaptoJavaMap(balMap); function balMaptoJavaMap(map<string> properties) returns javautil:Map? { javautil:HashMap hashMap = javautil:newHashMap1(); if (properties.length() > 0) { foreach string prop in properties.keys() { javalang:Object|error propKeyObj = prop.ensureType(javalang:Object); javalang:Object|error propObj = (properties.get(prop)).ensureType(javalang:Object); if (propKeyObj is error || propObj is error) { continue; } _ = hashMap.put(propKeyObj, propObj); } } javautil:Map|error javaMap = java:cast(hashMap); if javaMap is error { return (); } return javaMap; }
错误原因与解决方案
1. Ballerina String 转 javalang:Object 失败
Ballerina的原生string属于值类型,不能直接通过ensureType转换为javalang:Object(Java对象类型)。正确的做法是将Ballerina字符串转换为Java的java.lang.String对象——它是javalang:Object的子类,自然可以兼容put方法的参数要求。
使用java:fromString方法可以将Ballerina字符串转为Java的String对象(返回的handle本质是Java对象的引用,可直接作为javalang:Object使用):
javalang:String|error propKeyObj = java:fromString(prop); javalang:String|error propObj = java:fromString(properties.get(prop));
由于java.lang.String是javalang:Object的子类,上述变量可以直接传入hashMap.put()方法,无需额外转换。
2. HashMap 转 Map 时 java:cast 报错
javautil:HashMap本身就是javautil:Map的实现类,在Ballerina中支持子类型向上转型,不需要调用java:cast。直接将hashMap赋值给javautil:Map类型的变量即可,java:cast通常用于向下转型(比如将Map转为HashMap),向上转型不需要显式调用。
修正后的完整代码
javautil:Map? javaMap = balMaptoJavaMap(balMap); function balMaptoJavaMap(map<string> properties) returns javautil:Map? { javautil:HashMap hashMap = javautil:newHashMap1(); if (properties.length() > 0) { foreach string prop in properties.keys() { // 将Ballerina字符串转为Java String对象(兼容javalang:Object) javalang:String|error propKeyObj = java:fromString(prop); javalang:String|error propObj = java:fromString(properties.get(prop)); if (propKeyObj is error || propObj is error) { continue; } // 直接传入,Java String是Object的子类 _ = hashMap.put(propKeyObj, propObj); } } // HashMap是Map的实现类,直接返回即可,无需cast return hashMap; }
内容的提问来源于stack exchange,提问作者Nipuna Madhushan
相关产品推荐
相关产品推荐

