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
s。
因此,这种覆盖可能违反 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/63892739/