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
}
}
Error:
void Function(int) 不是 void Function(dynamic) 的有效重写
当我可以轻松通过的时候int
to dynamic
在方法参数中反之亦然,为什么当我重写方法时会看到错误。
PS:
我不是在寻找使用的解决方案extends Parent<int>
并让它工作,我想知道为什么当我重写一个方法与调用常规方法时,事情会受到不同的对待。
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')
on it?)
(请注意,这并不特定于方法覆盖。一般来说,在需要采用较宽类型的函数的地方,不能使用采用较窄类型的函数,即使较窄的类型源自较宽的类型。)
Dart 确实允许您使用covariant keyword https://dart.dev/guides/language/sound-problems#the-covariant-keyword抑制静态类型错误并显式允许覆盖,但请注意,这样做不一定是类型安全的,并且您将负责确保在运行时不会出现类型错误。
进一步阅读:维基百科的协变和逆变(计算机科学) https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Covariant_method_parameter_type
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)