java - 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;
    }
}

我想通过传递一个已经创建的 B 对象(使用实例化的类型参数),使用 .jnew() 从 R session 创建一个 A 对象,但是 rJava 总是给出错误:

java.lang.NoSuchMethodError: <init>

有解决办法吗?

最佳答案

这个问题有很多变化的部分。仔细阅读各个部分的文档,我认为您需要在中断的行上执行此操作:

gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet"))

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

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

  1. 在 Java 方面,DataReader.parseTabularData返回类型为 DataSet 的对象正如你所说,但是DataSet是接口(interface)不是类。这必然意味着返回的实际对象属于某个实现了 DataSet 的类。界面。
  2. 由于我不是很清楚的原因,rJava 包并没有真正很好地处理多态性。它要求您调用与您传递的对象具有“精确”签名匹配的方法。在这种情况下,您将需要从您获得的任何特定类“向上转换”到接口(interface) 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,我直觉地希望接口(interface)尊重 Java 的多态性。鉴于(无论出于何种原因),R 的接口(interface)在不考虑继承的情况下进行“精确”类型匹配,很明显,由于上面的原因 #1,它不会找到构造函数。

最后,在我对 Tetrad 的有限探索中,我实际上并没有遇到任何使用泛型的 Java 类。事实证明,这完全是转移注意力。如果将来它成为问题,您可能需要检查“Type Erasure”(https://docs.oracle.com/javase/tutorial/java/generics/erasure.html)。如果您在 Java 和 C、C++、Fortran 以及任何 Java 认为“本地”的语言之间进行交互,那么您将通过处理类型删除形式来处理本地代码中的泛型。 rJava 接口(interface)可能有所不同,因为这似乎属于使您陷入当前问题的相同一般结构类型。 (也许以后值得自己赏金!)

关于java - rJava 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15393351/

相关文章:

r - 如何将年份转换为 %Y%m%d %H :%M:%S?

java - java 中 goto 的替代方案

java - 从 JList Java Swing 中删除元素

r - 根据所有行值的总和从 R data.frame 中过滤出列

r - nrow>100时data.table打印错误

java - JAR 文件中的 JRI(Java/R 接口(interface))程序可以在没有安装 R 的系统上运行吗?

r - 在 Win7 上加载 rJava 包时出现问题

r - 在docker内部的R 3.3.2上安装rJava和nloptr

java - 错误 500 - NoClassDefFoundError : org/hsqldb/lib/LongValueHashMap

java - 如何在 Java/Groovy 中为 Azure API(Api 管理)生成 SAS token ?