我一直在使用rJava包,但是由于rJava似乎不知道Java泛型类型,所以我很难用泛型类型参数创建java对象。如果我有一个java类,如:
public class A<T> {
private B<T> b;
public A(B<T> b) {
this.b = b;
}
}我希望通过传递一个已经创建的B对象(带有实例化类型参数),使用.jnew()从R会话中创建一个A对象,但是rJava总是会给出错误:
java.lang.NoSuchMethodError: <init>有这方面的工作吗?
发布于 2015-09-17 01:06:29
这个问题中有很多运动部件。通过对各个部分的文档进行挖掘,我认为您需要在中断的代码中这样做:
gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))关键的区别是对第二个参数的.jcast调用。(我没有安装R,所以我无法测试它--如果它不能工作,我将根据您可以提供的关于新错误消息的任何反馈来更新我的答案。)
那么问题是“为什么?”答案似乎是:
DataReader.parseTabularData返回一个DataSet类型的对象,但DataSet是一个接口,而不是类。这必然意味着返回的实际对象属于实现DataSet接口的某个类。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“(https://docs.oracle.com/javase/tutorial/java/generics/erasure.html)。如果您在Java与C、C++、Fortran之间进行接口,以及任何Java认为是“本机语言”的语言,那么您将通过处理类型擦除的表单来处理本机代码中的泛型。不过,rJava接口可能不一样,因为这似乎属于使您对当前问题感到困惑的相同的一般结构类型。(也许以后会得到它自己的赏金!)
https://stackoverflow.com/questions/15393351
复制相似问题