class Parent<T> {
void method(T t) {}
}
class Child extends Parent {
@override
void method(int i) {} // error: mentioned_below
void takesDynamic(dynamic d) {
takesType(d); // no error
}
void takesType(int i) {
takesDynamic(i); // no error
}
}
错误:
void Function(int) isn't a valid override of void Function(dynamic)
当我可以轻松通过int
至dynamic
在方法参数中反之亦然,为什么我在覆盖方法时会看到错误。
PS:
我不是在寻找使用 extends Parent<int>
的解决方案让它工作,我想知道为什么当我覆盖一个方法和调用常规方法时,为什么事情会被区别对待。
最佳答案
void Function(int x)
通常不是 void Function(dynamic x)
的有效覆盖因为 int
版本不可替代 dynamic
版本。
Parent<dynamic>.method
的允许输入是什么? ? 任何东西。
Child.method
的允许输入是什么? ?只需int
秒。
因此,这种覆盖可能违反 Parent<dynamic>
的契约(Contract)。的界面。 (例如,如果你有一个 Child
的实例并将它传递给期望 Parent<dynamic>
的对象,然后调用 method('not an int')
呢?)
(请注意,这不是特定于方法覆盖的。一般情况下,不能使用采用较窄类型的函数来预期采用较宽类型的函数,即使是较窄类型派生自更广泛的类型。)
Dart 确实允许您使用 covariant
keyword抑制静态类型错误并明确允许覆盖,但请注意,这样做不一定是类型安全的,您需要负责确保在运行时不会出现类型错误。
延伸阅读:Covariance and contravariance (computer science) from Wikipedia
关于dart - void Function(int) 不是 void Function(dynamic) 的有效覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61966135/