rJava调用.jnew传int参数到Java构造函数报NoSuchMethodError如何解决
问题根因
R中直接输入的数字默认是双精度浮点型(numeric),对应Java侧的double原生类型。rJava做方法签名匹配时不会自动把浮点型隐式转成int,因此无法匹配你定义的TestRJava(String, int)构造方法,触发NoSuchMethodError。
另外你传整数参数的代码里类名写法有误:用了点分隔的testRJava.TestRJava,rJava要求全限定类名必须用斜杠分隔,要和你之前能正常运行的testRJava/TestRJava写法保持一致,类名格式错误也会报同类错误。
解决方法
- 最简便的写法:给R侧的整数加
L后缀,显式标记为R整型,rJava会自动把它映射为Java的int类型,直接匹配对应构造函数:
obj <- .jnew('testRJava/TestRJava', "Hello", 123L)
- 如果参数是提前定义好的数值变量,用rJava内置的
.jint()函数显式转成Java int类型再传参即可:
raw_param <- 123 java_int <- .jint(raw_param) obj <- .jnew('testRJava/TestRJava', "Hello", java_int)
- 如果类里重载方法特别多、还是存在签名匹配歧义,可以在
.jnew里加check = FALSE先跳过预检查,配合上面的显式类型转换就能准确匹配目标构造方法。
补充说明:这个场景不需要使用.jcast,.jcast仅用于对已生成的Java对象引用做类型强转,无法处理R侧基础数据类型到Java原生类型的映射问题。
内容的提问来源于stack exchange,提问作者Murmulodi
相关产品推荐
相关产品推荐

