跳到主要内容

invalid_implementation_override

'{1}.{0}' ('{2}') 不是 '{3}.{0}' ('{4}') 的有效具体实现。

setter '{1}.{0}' ('{2}') 不是 '{3}.{0}' ('{4}') 的有效具体实现。

描述

#

当满足以下所有条件时,分析器会生成此诊断信息:

  • 类定义了一个抽象成员。
  • 其超类中存在该成员的具体实现。
  • 该具体实现不是抽象方法的有效实现。

具体实现可能无效的原因是返回类型、方法参数类型或类型参数不兼容。

示例

#

以下代码会生成此诊断信息,因为方法 A.add 的参数类型为 int,而覆盖方法 B.add 的对应参数类型为 num

dart
class A {
  int add(int a) => a;
}
class B extends A {
  int add(num a);
}

这是个问题,因为在对 B.add 的调用中,例如:

dart
void f(B b) {
  b.add(3.4);
}

B.add 期望能够接受(例如)一个 double 类型的值,但当方法 A.add 被执行时(因为它是 add 唯一的具体实现),会抛出运行时异常,因为 double 类型的值无法赋值给 int 类型的参数。

常见修复方法

#

如果子类中的方法可以符合超类中的实现,则更改子类中的声明(如果相同则删除)

dart
class A {
  int add(int a) => a;
}
class B	extends A {
  int add(int a);
}

如果超类中的方法可以被泛化以成为子类中方法的有效实现,则更改超类方法

dart
class A {
  int add(num a) => a.floor();
}
class B	extends A {
  int add(num a);
}

如果超类中的方法和子类中的方法都不能更改,则在子类中提供该方法的具体实现

dart
class A {
  int add(int a) => a;
}
class B	extends A {
  int add(num a) => a.floor();
}