gpt4 book ai didi

Groovy - 如何在带有编译静态的 Map 中重载 '+=' 运算符?

转载 作者:行者123 更新时间:2023-12-02 10:54:32 25 4
gpt4 key购买 nike

在 Groovy 中,我可以重载运算符 '+' plus 如下:

class MutableInt {
int val

MutableInt(int val) { this.val = val }

MutableInt plus(int val) {
return new MutableInt(this.val += val)
}
}
上述类适用于以下测试用例:
def m1 = new MutableInt(1);
assert (m1 + 1).val == 2;
但是,如果我需要将它与 Map 一起使用像这样并用静态编译它
@groovy.transform.CompileStatic
void compileItWithStatic() {
Map<Long, MutableInt> mutMap = [:].withDefault{ new MutableInt(0) }
assert (mutMap[1L] += 20).val == 20;
}
compileItWithStatic()
我收到以下错误:
*Script1.groovy: 17: [Static type checking] - 
Cannot call <K,V> java.util.Map <java.lang.Long, MutableInt>#putAt(java.lang.Long, MutableInt) with arguments [long, int]*
如何覆盖 '+=' 运算符并使用静态编译它而不会出错?
编辑:
如果我这样做没有编译静态它工作正常:
def m1 = new MutableInt(1);
assert (m1 += 1).val == 2 // <----- caution: '+=' not '+' as in previous case
但是,如果它在这样的方法中:
@groovy.transform.CompileStatic
void compileItWithStatic_2() {
def m1 = new MutableInt(1);
assert (m1 += 1).val == 2
}
错误将是:
Script1.groovy: -1: Access to java.lang.Object#val is forbidden @ line -1, column -1.
1 error
附言它不适用于静态编译,不适用于动态编译。

最佳答案

分配部分正在抛出错误。一个简单的+作品:

class MutableInt {
int val

MutableInt(int val) { this.val = val }

MutableInt plus(int val) {
return new MutableInt(this.val += val)
}
}

def m1 = new MutableInt(1);
assert (m1 + 1).val == 2;


@groovy.transform.CompileStatic
def compileItWithStatic() {
Map<Long, MutableInt> mutMap = [:].withDefault{ new MutableInt(0) }
mutMap[1L] + 20
mutMap
}

assert compileItWithStatic()[1L].val == 20

Groovy 正在解析 mutMap[1L] += 20mutMap.putAt(1L, 20) .这对我来说似乎是一个错误。这个作品: mutMap[1L] = mutMap[1L] + 20 ,虽然更冗长。

编辑:第二个错误似乎与表达式 (m1 + 1) 的结果有关被解析为 Object .这应该有效:
@groovy.transform.CompileStatic
void compileItWithStatic_2() {
def m1 = new MutableInt(1) + 1;
assert m1.val == 2
}

关于Groovy - 如何在带有编译静态的 Map 中重载 '+=' 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com