我一直在使用rJava包,但由于似乎rJava不知道Java泛型类型,因此我很难用泛型类型参数创建java对象.如果我有一个java类,如:
public class A<T> {
private B<T> b;
public A(B<T> b) {
this.b = b;
}
}
Run Code Online (Sandbox Code Playgroud)
我想.jnew()
通过传递已经创建的B对象(使用实例化的类型参数)从R会话创建一个A对象,但是rJava总是给出错误:
java.lang.NoSuchMethodError: <init>
Run Code Online (Sandbox Code Playgroud)
这有什么工作吗?
这个问题有很多变化的部分。深入研究各个部分的文档,我认为您需要在中断的线路上执行此操作:
gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))
Run Code Online (Sandbox Code Playgroud)
.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 类。事实证明,这完全是转移注意力。如果将来出现问题,您可能需要查看“类型擦除”( https://docs.oracle.com/javase/tutorial/java/generics/erasure.html )。如果您在 Java 和 C、C++、Fortran 以及 Java 认为是“本机”的任何语言之间进行交互,那么您将通过处理类型擦除的形式来处理本机代码中的泛型。不过,rJava 接口可能有所不同,因为这似乎属于使您陷入当前问题的相同通用结构类型。(也许以后值得它自己的赏金!)
归档时间: |
|
查看次数: |
914 次 |
最近记录: |