rJava泛型类型
我一直在使用rJava包,但由于rJava似乎不知道Java泛型类型,所以我很难使用泛型类型参数创建Java对象。如果我有一个java类,比如:rJava泛型类型,java,r,rjava,Java,R,Rjava,我一直在使用rJava包,但由于rJava似乎不知道Java泛型类型,所以我很难使用泛型类型参数创建Java对象。如果我有一个java类,比如: public class A<T> { private B<T> b; public A(B<T> b) { this.b = b; } } 有什么解决办法吗?这个问题中有很多活动部件。翻阅各个部分的文档,我认为您需要在发生故障的线路上执行以下操作: gesinstance
public class A<T> {
private B<T> b;
public A(B<T> b) {
this.b = b;
}
}
有什么解决办法吗?这个问题中有很多活动部件。翻阅各个部分的文档,我认为您需要在发生故障的线路上执行以下操作:
gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))
关键区别在于对第二个参数调用.jcast
。(我没有安装R,所以我无法测试它-如果它不起作用,我将根据您对新错误消息提供的任何反馈更新我的答案。)
那么问题是“为什么会这样?”答案似乎是:
DataReader.parsetablerdata
返回类型为DataSet
的对象,但DataSet
是接口而不是类。这必然意味着返回的实际对象属于实现DataSet
接口的某个类数据集
。请参阅.jnew
()的文档,特别是它们用“…”表示的参数。这使您可以参考.jcall
()文档的相应部分,然后通过一些示例解释调用.jcast
()的要求java.lang.NoSuchMethodError:
告诉您JVM找不到您调用的构造函数。在你在评论中发布的示例中,这看起来很神秘。(顺便说一句,编辑您的问题,并将这些信息包含在上面以供后人使用可能会很好。)代码看起来确实正确,而且,了解Java,我直觉上希望接口尊重Java的多态性。考虑到这一点(无论出于何种原因),R的接口在不考虑继承的情况下进行“精确”类型匹配,很明显,由于上面的原因#1,它将找不到构造函数
最后,在我有限的四分体探索中,我实际上没有遇到任何使用泛型的Java类。事实证明,这完全是一个骗局。如果这在将来成为一个问题,您可能会想查看“类型擦除”()。如果你在Java和C、C++、FORTRAN之间连接,java认为是“java”的任何语言,那么你就可以通过处理类型擦除的形式来处理本地代码中的泛型。不过rJava接口可能会有所不同,因为它似乎属于与当前问题相同的一般结构类型。(以后可能值得一试!)调用
.jnew()
时使用的确切语法是什么?你在传递它吗?请准确地指定它们。下面是一个有效的示例。您需要从(19mb)下载Tetrad jar,从下载示例数据集charity.txt。在R中设置:setwd(“where/you/put/the/data/”
,library(rJava)
,.jinit(“path/to/tetrad-5.2.1-3.jar”)
。主要工作如下:1<代码>文件名=.jnew(“java/lang/String”,“charity.txt”),2<代码>数据文件=.jnew(“java/io/File”,文件名),3reader=.jnew(“edu/cmu/tetrad/data/DataReader”)
,4delim=J(“edu/cmu/tetrad/data/DelimiterType”)
,5<代码>读卡器$setDelimiter(delim$TAB),6<代码>数据集=读取器$ParseTabler(数据文件)。但以下几点不起作用:7gesinstance=.jnew(“edu/cmu/tetrad/search/Ges”,数据集)
。reader$ParseTabler返回一个数据集,Ges类应该使用一个数据集参数创建。不幸的是,这不起作用。我认为原因在于Ges实现了两个接口,GraphSearch和GraphScore,而GraphScore只是一个双重接口。在Java源代码中:public interface GraphScorer{double scoreDag(Graph dag);}
我没有Java方面的经验,因此很遗憾,我无法构建一个在Java方面更简单的示例,对不起!如果有帮助的话,四分体源代码发行版只提供一点帮助。谢谢!!这解决了我所面临的问题,让我对rJava(以及Java本身)有了更好的理解。我不知道该如何编辑这个问题,因为我没有问最初的问题,你已经发现这是一个与我所面临的完全不同的问题。也许我应该把问题分成两部分?
gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))