dart - void Function(int) 不是 void Function(dynamic) 的有效覆盖
问题描述
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>
并让它工作的解决方案,我想知道为什么当我覆盖一个方法与调用常规方法时事情会被不同地对待的原因。
解决方案
void Function(int x)
通常不是有效的覆盖,void Function(dynamic x)
因为该int
版本不可替代该dynamic
版本。
允许的输入是Parent<dynamic>.method
什么?任何东西。
允许的输入是Child.method
什么?只是int
s。
因此,这样的覆盖可能会违反Parent<dynamic>
's 接口的合同。(例如,如果您有一个实例Child
并将其传递给期望Parent<dynamic>
的对象,然后method('not an int')
在其上调用呢?)
(请注意,这并不特定于方法覆盖。 一般来说,采用较窄类型的函数不能用于预期采用较宽类型的函数,即使较窄类型派生自较宽类型。)
Dart 确实允许您使用covariant
关键字来抑制静态类型错误并明确允许覆盖,但请注意,这样做不一定是类型安全的,您将负责确保您不会在运行。
进一步阅读:来自维基百科的协变和逆变(计算机科学)
推荐阅读
- python - OpenCV 鸟瞰图拼接
- python - 列表元素的 Python 组合
- html - 如何在 Laravel 中将复选框值插入 DB?
- python - 尝试通过表在 Django 模型中使用多对多关系时出错
- node.js - Discord.js 将嵌入发送到已创建的新频道并随机配对 2 个用户进行战斗
- android - PopupWindow中的ArrayIndexOutOfBoundsException?
- json - 我应该如何从 (json-server) 的模拟 json-server 返回分页记录?
- python - PyGame 更改预设声音字体
- nuxtjs - 如何访问 serverMiddleware 中 Nuxt.config.js 中声明的 privateRuntimeConfig?
- c# - 如何在 Xamarin 表单中使用 WifiManager