Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rJava泛型类型_Java_R_Rjava - Fatal编程技术网

rJava泛型类型

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

我一直在使用rJava包,但由于rJava似乎不知道Java泛型类型,所以我很难使用泛型类型参数创建Java对象。如果我有一个java类,比如:

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,所以我无法测试它-如果它不起作用,我将根据您对新错误消息提供的任何反馈更新我的答案。)

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

  • 在Java方面,
    DataReader.parsetablerdata
    返回类型为
    DataSet
    的对象,但
    DataSet
    是接口而不是类。这必然意味着返回的实际对象属于实现
    DataSet
    接口的某个类
  • 由于我现在还不清楚的原因,rJava包并不能很好地处理多态性。它要求调用与所传递的对象具有“精确”签名匹配的方法。在这种情况下,您需要从任何特定的类向上转换到接口
    数据集
    。请参阅
    .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”,文件名),3
    reader=.jnew(“edu/cmu/tetrad/data/DataReader”)
    ,4
    delim=J(“edu/cmu/tetrad/data/DelimiterType”)
    ,5<代码>读卡器$setDelimiter(delim$TAB),6<代码>数据集=读取器$ParseTabler(数据文件)。但以下几点不起作用:7
    gesinstance=.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"))