这个问题有很多活动部分.挖掘各个部分的文档,我认为您需要在破坏的行上执行此操作:
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接口可能会有所不同,因为这似乎属于相同的一般结构类型,使您在当前问题上绊倒. (以后可能值得拥有自己的恩惠!)