我试图在Groovy中使用一个Java库,但是Groovy正在用自己的方法覆盖命名为join的方法之一。
以下代码失败:
%%classpath add mvn
tech.tablesaw tablesaw-core 0.32.6
tech.tablesaw tablesaw-beakerx 0.32.6
com.jimmoores quandl-tablesaw 2.0.0
%import com.jimmoores.quandl.*
%import com.jimmoores.quandl.tablesaw.*
%import tech.tablesaw.api.*
// display Tablesaw tables with BeakerX table display widget
tech.tablesaw.beakerx.TablesawDisplayer.register()
TableSawQuandlSession session = TableSawQuandlSession.create();
Table table1 = session.getDataSet(DataSetRequest.Builder.of("FRED/BCNSDODNS").build());
table1.column("Value").setName("Corporate Credit");
Table table2 = session.getDataSet(DataSetRequest.Builder.of("FRED/CMDEBT").build());
table2.column("Value").setName("Household Credit");
Table result = table1.join("Date").inner(table2, "Date");错误是:
groovy.lang.MissingMethodException:没有方法的签名: java.lang.String.inner()适用于参数类型:(tech.tablesaw.api.Table,java.lang.String)
奇怪的是,Table.join(String)返回一个DataFrameJoiner:https://static.javadoc.io/tech.tablesaw/tablesaw-core/0.32.6/tech/tablesaw/api/Table.html#join-java.lang.String...-
我认为现在发生的事情是Table是一个Iterable<Row>,所以可能Groovy正在选择它自己的连接方法。
奇怪的是,如果我将Tablesaw版本从0.32.6切换到0.24.9,即使是在那个版本中,它也能工作。
您知道如何才能强制Groovy使用表库中的join方法而不是它自己的join方法吗?
发布于 2019-06-01 02:40:39
根据另一个答案,这种特殊情况可以通过在方法调用中使用显式类型来解决。以下是有关GroovyDefaultMethod覆盖的一般主题的更多背景信息。
有关这方面的文件很少。一些旧的电子邮件线程与来自DefaultGroovyMethods的这些方法有关。
这可能解释了为什么在不同的Tablesaw版本中得到不同的结果,具体取决于来自Iterable的确切继承细节。
由此,我相信您可以修改Table的元类以使用您想要使用的方法。由于DefaultGroovyMethods的应用程序也取决于继承细节,所以您也可以尝试子类表。
元编程文档也可能会有所帮助。
https://stackoverflow.com/questions/56401713
复制相似问题