rJava泛型类型

use*_*795 8 java r rjava

我一直在使用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)

这有什么工作吗?

Bri*_*ick 2

这个问题有很多变化的部分。深入研究各个部分的文档,我认为您需要在中断的线路上执行此操作:

gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))
Run Code Online (Sandbox Code Playgroud)

.jcast主要区别在于对第二个参数的调用。(我没有安装 R,所以我无法对此进行测试 - 如果它不起作用,我将根据您可以提供的有关新错误消息的任何反馈来更新我的答案。)

那么问题是“为什么会这样?” 答案似乎是:

  1. 在 Java 方面,DataReader.parseTabularData返回一个具有您所指出的类型的对象DataSet,但DataSet它是一个接口而不是类。这必然意味着返回的实际对象属于实现该DataSet接口的某个类。
  2. 由于我不太清楚的原因,rJava 包并不能真正很好地处理多态性。它要求您调用具有与您传递的对象“完全”匹配的签名的方法。在这种情况下,您将需要从您获得的任何特定类“向上转换”到接口DataSet.jnew请参阅( https://www.rforge.net/doc/packages/rJava/html/jnew.html )的文档,尤其是它们用“...”表示的参数。这会让您参考.jcallhttps://www.rforge.net/doc/packages/rJava/html/jcall.html)文档的相应部分,然后解释调用的要求.jcasthttps://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 接口可能有所不同,因为这似乎属于使您陷入当前问题的相同通用结构类型。(也许以后值得它自己的赏金!)