java r类型_rJava泛型类型

这个问题有很多活动部分.挖掘各个部分的文档,我认为您需要在破坏的行上执行此操作:

gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))

关键的区别是在第二个参数上调用.jcast. (我没有安装R,所以我无法测试它 – 如果它不起作用,我会根据您可以提供的有关新错误消息的任何反馈更新我的答案.)

那么问题是“为什么呢?”答案似乎是:

>在Java端,DataReader.parseTabularData返回一个类型为DataSet的对象,但是DataSet是一个接口而不是类.这必然意味着返回的实际对象是实现DataSet接口的某个类.

>由于我不能立即明白的原因,rJava包并不能很好地处理多态.它要求您调用与您传递的对象具有“精确”签名匹配的方法.在这种情况下,您需要从接口DataSet的任何特定类中“向上转换”.请参阅.jnew(https://www.rforge.net/doc/packages/rJava/html/jnew.html)的文档,特别是它们用“…”表示的参数.这将引用.jcall(https://www.rforge.net/doc/packages/rJava/html/jcall.html)文档的相应部分,然后解释了使用一些示例调用.jcast(https://www.rforge.net/doc/packages/rJava/html/jcast.html)的要求.

你得到的错误java.lang.NoSuchMethodError:< init>告诉你JVM找不到你调用的构造函数.您在评论中发布的示例中看起来很神秘. (顺便说一下,编辑你的问题可能会很好,并为后代包含那些信息.)代码当然看起来正确,并且,在了解Java时,我直观地期望接口尊重Java的多态性.鉴于(无论出于何种原因),R的接口在不考虑继承的情况下进行“精确”类型匹配,很明显,由于上面的原因#1,它不会找到构造函数.

最后,在我对Tetrad的有限探索中,我实际上并没有遇到任何使用泛型的Java类.事实证明,这是一个完整的红鲱鱼.如果它将来成为一个问题,你可能想看一下“Type Erasure”(https://docs.oracle.com/javase/tutorial/java/generics/erasure.html).如果您在Java和C,C,Fortran,Java认为是“本机”的任何语言之间进行接口,那么您将通过处理类型擦除的表单来处理本机代码中的泛型.但是,rJava接口可能会有所不同,因为这似乎属于相同的一般结构类型,使您在当前问题上绊倒. (以后可能值得拥有自己的恩惠!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值