如果覆盖`hashCode`则覆盖`==`

Sco*_*ttF 5 dart flutter

我在 Dart 上有以下课程......

\n\n
class Color {\n    final int value;\n    const Color._internal(this.value);\n\n    static const Color WHITE = const Color._internal(0);\n    static const Color BLACK = const Color._internal(1);\n\n    int get hashCode => value;\n    String toString() => (this == WHITE) ? 'w' : 'b';\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我运行 flutteranalyze 命令时,出现以下错误...

\n\n
\n

info \xe2\x80\xa2==如果覆盖hashCode\xe2\x80\xa2 lib/chess.dart:1584:13\n \xe2\x80\xa2 hash_and_equals 则覆盖

\n
\n\n

作为测试,我添加了该方法

\n\n
bool operator==(Object o) => true;\n
Run Code Online (Sandbox Code Playgroud)\n\n

但后来我遇到了另一个分析仪问题......

\n\n
\n

错误 \xe2\x80\xa2 常量映射条目键表达式类型“Color”无法\n 覆盖 == 运算符 \xe2\x80\xa2 lib/chess.dart:44:3 \xe2\x80\xa2\n const_map_key_expression_type_implements_equals

\n
\n\n

这是因为 Color 对象被用作静态 const 映射中的键......

\n\n
static const Map<Color, List> PAWN_OFFSETS = const {\n    BLACK: const [16, 32, 17, 15],\n    WHITE: const [-16, -32, -17, -15]\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,我对防止这些分析器问题的选择是什么感到困惑。

\n\n

如果我删除 hashCode,该类将无法在映射中工作...\n如果我添加 == 运算符,我只会收到不同的错误。

\n\n

最好的选择是什么?

\n

dro*_*gel -1

a 中不能有两个相等的键Map,并且您通过声明告诉编译器任何Color对象都等于任何其他Color对象:

bool operator==(Object o) => true;
Run Code Online (Sandbox Code Playgroud)

这样,编译器认为BLACKWHITE是同一件事。但是,如果你这样做:

bool operator==(Object o) => o is Color && o.value == value;
Run Code Online (Sandbox Code Playgroud)

仅当两个对象的 s 相等时,编译器才会认为Color它们value相等。因此,不再考虑BLACKWHITE是否相等(因为它们的值不同),问题应该得到解决。