我在 Dart 上有以下课程......
\n\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n\n当我运行 flutteranalyze 命令时,出现以下错误...
\n\n\n\n\ninfo \xe2\x80\xa2
\n==如果覆盖hashCode\xe2\x80\xa2 lib/chess.dart:1584:13\n \xe2\x80\xa2 hash_and_equals 则覆盖
作为测试,我添加了该方法
\n\nbool operator==(Object o) => true;\nRun Code Online (Sandbox Code Playgroud)\n\n但后来我遇到了另一个分析仪问题......
\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
这是因为 Color 对象被用作静态 const 映射中的键......
\n\nstatic const Map<Color, List> PAWN_OFFSETS = const {\n BLACK: const [16, 32, 17, 15],\n WHITE: const [-16, -32, -17, -15]\n};\nRun Code Online (Sandbox Code Playgroud)\n\n因此,我对防止这些分析器问题的选择是什么感到困惑。
\n\n如果我删除 hashCode,该类将无法在映射中工作...\n如果我添加 == 运算符,我只会收到不同的错误。
\n\n最好的选择是什么?
\ndro*_*gel -1
a 中不能有两个相等的键Map,并且您通过声明告诉编译器任何Color对象都等于任何其他Color对象:
bool operator==(Object o) => true;
Run Code Online (Sandbox Code Playgroud)
这样,编译器认为BLACK和WHITE是同一件事。但是,如果你这样做:
bool operator==(Object o) => o is Color && o.value == value;
Run Code Online (Sandbox Code Playgroud)
仅当两个对象的 s 相等时,编译器才会认为Color它们value相等。因此,不再考虑BLACK和WHITE是否相等(因为它们的值不同),问题应该得到解决。
| 归档时间: |
|
| 查看次数: |
3527 次 |
| 最近记录: |