跳到主要內容

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();
}