Groovy运算符重载Java基元的装箱

时间:2018-03-14 13:06:25

标签: java groovy operator-overloading

我试图利用Groovy的Operator Overloading,在Groovy上下文中使用我的Java类方法(GroovyShell):

我的类实际上是键和值的有序映射,因此界面看起来像这样:

public interface GroovyMap<K, V> {
  // gets the value associated with the given key
  V getAt(K key);
  // gets the nth value, at the given index, in the ordered sequence of values
  V getAt(int index); 
}

getAt(K key)方法在Groovy中正常工作:

GroovyMap<LocalDate, Double> map = ...
K key = ...
Double value = map[key];

但是,getAt(int index)方法在Groovy中工作 - 即:

GroovyMap<LocalDate, Double> map = ...
int i = 0;
Double value = map[i];

会抛出CastClassException

  

java.lang.Integer无法强制转换为javax.time.calendar.LocalDate

我不完全确定这里发生了什么:

  • Groovy在数字和基元方面有一些时髦的行为(例如0.0被有效地解释为new BigDecimal("0.0")),但我认为明确定义i为{{1}会解决这个问题。
  • 看起来Groovy运算符重载正在装载任何原始值,因此它试图将int传递给有效的Double方法。但是,我无法找到任何相关的文档。如果是这样的话,你可以指导我这么做吗?
  • 这里还有其他事情我不知道吗?

1 个答案:

答案 0 :(得分:0)

经过一些进一步的研究,我发现还有其他(方法)运算符可以在Groovy中重载 - c.f. documentation,特别是getAt()运算符。注意 - 调用操作符可以使用任意数量的参数。

我尝试将call()两种方法更改为getAt(),但发现我遇到了同样的问题。但是,如果我使用getAt(int index)(即call())保留一个方法,并更改一个方法以使用call(int index) (即int)。

因此,我怀疑这个问题是Groovy将Integer视为getAt(LocalDate date)Groovy uses Objects for everything),然后它会找到Integer方法,但不能将LocalDate投射到getAt(int index),并且永远不会识别Integer或尝试取消装箱next以使用它。