我试图利用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
我不完全确定这里发生了什么:
0.0
被有效地解释为new BigDecimal("0.0")
),但我认为明确定义i
为{{1}会解决这个问题。int
传递给有效的Double
方法。但是,我无法找到任何相关的文档。如果是这样的话,你可以指导我这么做吗?答案 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
以使用它。