最小可复制代码:
void main() {
const one = Foo();
const two = Foo();
print(one == two);
}
class Foo {
const Foo();
@override
bool operator ==(Object other) {
assert(super == this); // Works (Line - 1)
return this == other; // Error (Line - 2)
// return super == other; // Works
}
}断言工作为(Line - 1),但(Line - 2)失败时出现了以下错误。然而,return super == other也能工作。
Uncaught :最大调用堆栈大小exceededError: RangeError:最大调用堆栈大小超过
发布于 2021-04-11 16:17:46
首先,第1行可以工作,因为您使用的是来自==类的Object运算符,该操作符根据对象的地址确定相等。
在第2行,您将看到堆栈溢出(错误,而不是此网站),因为当您测试是否相等时,将调用==操作符,但当执行到达“第2行”时,您将再次调用==操作符,从而导致对==方法的递归调用。这会导致一个无限循环,用对==的调用填充您的调用堆栈,直到它溢出,从而导致您正在获得的错误。
在重载操作符时,super或this没有特殊的意义。它们的含义和以往一样。this引用当前对象。super引用父对象。(请记住,如果没有指定任何对象,则所有对象都有一个隐含的Object超类。
https://stackoverflow.com/questions/67046754
复制相似问题