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)不是void Function(dynamic)的有效覆盖
当我可以很容易地在方法参数中传递int
到dynamic
,反之亦然,为什么我在重写方法时会看到错误。
PS:
我并不是在寻找一个使用extends Parent<int>
并让它工作的解决方案,我想知道为什么当我重写一个方法和调用常规方法时,事情会被不同地对待。
1条答案
按热度按时间oxcyiej71#
void Function(int x)
通常不是void Function(dynamic x)
的有效覆盖,因为int
版本不能替代dynamic
版本。void Function(dynamic)
(Parent<dynamic>.method
的类型)允许的输入是什么?Anything。void Function(int)
(Child.method
的类型)允许的输入是什么?只有int
s。因此,这样的覆盖可能会违反
Parent<dynamic>
接口的约定(例如,如果您有一个Child
的示例,并将其传递给需要Parent<dynamic>
的对象,然后该对象在其上调用method('not an int')
,该怎么办?)(Note一般来说,在需要采用较宽类型的函数的地方,不能使用采用较窄类型的函数,即使较窄类型派生自较宽类型。
Dart允许你使用
covariant
关键字来抑制静态类型错误并显式地允许重写,但要注意这样做不一定是类型安全的,你需要负责确保在运行时不会得到类型错误。进一步阅读:协变与逆变(计算机科学)