当前位置: 首页 > 知识库问答 >
问题:

防止GroovyDefaultMethods join()隐藏Java类的join()方法?

宗政天逸
2023-03-14
%%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");

这很奇怪table.join(String)返回一个dataframejoiner:https://static.javadoc.io/tech.tablesaw/tablesaw-core/0.32.6/tece/tablesaw/api/table.html#join-java.lang.String...-

我认为,table是一个iterable ,所以也许Groovy正在使用它自己的join方法。

真正奇怪的是,如果我将Tablesaw版本从0.32.6切换到0.24.9,即使table也在该版本中实现了iterable

知道如何强制Groovy使用Tablesaw库中的join方法而不是自己的join方法吗?

共有1个答案

文心思
2023-03-14

您会遇到这个问题,因为table.join()方法的原型如下:

public DataFrameJoiner join(String... columnNames)

来源:https://static.javadoc.io/tech.tablesaw/tablesaw-core/0.32.6/teck/tablesaw/api/table.html#join-java.lang.string...-

您已经注意到,Groovy通过其join()方法增强了iterable 类,但其原型如下:

public String join(String separator)

这就是为什么在以下情况下:

table1.join("Date").inner(table2, "Date");

Groovy解析iterable .join(字符串分隔符) 而不是table类中的方法。它在0.24.9版本中运行良好,只是因为它提供了一个具有以下原型的方法:

public DataFrameJoiner join(String columnName)

来源:https://static.javadoc.io/tech.tablesaw/tablesaw-core/0.24.9/teck/tablesaw/api/table.html#join-java.lang.string-

您可以通过使用显式的字符串[]参数信息进行调用来解决这个问题,因此Groovy会立即选择正确的方法。

table1.join(["Date"] as String[]).inner(table2, "Date")

如果传递两个字符串使Groovy选择varargs方法,则无需任何显式的参数类型信息。

table1.join("Date", "Something").inner(table2, "Date")

但是,在单个字符串参数的情况下,由于两个重载方法定义,您需要做出显式参数选择。

 类似资料:
  • 问题内容: 我想知道为什么Java对于具有相同名称的实例变量的超类和子类具有这种奇怪的行为。 假设我们有以下类定义: 通过这样做,我们应该隐藏了超类的变量。如果我们没有明确指定的方式来访问的通过电话,那么我们就应该永远无法获得一个孩子的一个实例。 但是,当我们进行强制转换时,此隐藏机制将中断: 这不是完全避开整个野外躲藏点吗?如果是这种情况,那么这是否会使该想法完全没有用? 在子类中,不能用其简单

  • 在java中引发RuntimeException时,需要抑制打印异常消息,而不使用自定义异常。 但是我们应该能够通过调用getMessage()来获取该消息* 运行此片段时,它不应该在控制台中打印“my mesage”。

  • 这似乎是一件奇怪的事情,但是在Java中有没有办法阻止子类添加新方法(包括构造函数),同时仍然允许子类重写方法? 实际情况是,我们有一个带有一些抽象方法和构造函数的

  • 我有一个自定义的Spinner类,它使用一个警报对话框来显示它的内容,它有“提交”和“取消”按钮。警报对话框有一个编辑文本,其他都是只读标签。在单击编辑文本时,虚拟键盘出现,它移动布局,向上移动位,但按钮保持隐藏。我希望按钮也是可见的。 在活动类中:-this.getWindow().setSoftinPutMode(Windowmanager.layoutParams.soft_input_ad

  • 我有一个主类。应用程序中有许多子类是从类扩展而来的。base类公开公共方法,如下所示: 应用程序将在子实例上调用以获得一个检查器实例。每个子类都可以有自定义的基本检查器和验证检查器。他们可以使用和方法实现它,但是他们不能覆盖基类的,因为它包含处理逻辑。 在这里使用关键字合适吗?

  • 我理解不同的行为(与覆盖相比是新的),但不理解术语。