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