dart - Dart TypeError:类型不是 Null 类型的子类型
问题描述
考虑以下代码:
void printInt(int i) => print(i);
void printString(String s) => print(s);
void printSomething(Object o) {
final printer = {
int: printInt,
String: printString,
}[o.runtimeType];
print('Printer is $printer');
printer(o);
}
void main() => printSomething('Hello');
它打印正确的printString
函数,然后崩溃,出现以下异常:
TypeError: "Hello": type 'String' is not a subtype of type 'Null'
为什么会这样?
解决方案
该错误来自您的地图已被赋予该类型这一事实,Map<Type, void Function(Null)>
因为这是根据您列表的内容它可以使用的唯一类型。
问题是 Dart 不能为你的地图提供另一种类型,因为从类型系统的角度来看,其他任何东西都是无效的。假设类型是Map<Type, void Function(Object)>
. 好吧,然后我们就可以从这个映射中将任何对象发送到一个方法中。但这是不允许的,因为您在地图中的两种方法明确定义为 acceptint
和String
not Object
。
我们可以给它类型Map<Type, void Function(int)>
,因为我们有一个采用String
.
此外,由于两种方法都明确定义为采用精确类型,Map<Type, void Function(dynamic)>
因此存在相同的问题。Object
所以 Dart 将改为使用Null
参数的类型,因为我们唯一知道给这两种方法都有效的是null
值。
并且由于您随后尝试将String
as 参数提供给具有您的签名的方法,因此void Function(Null)
您会从类型系统中得到一个错误。
如果你想让你的代码运行,你需要告诉类型系统来保持你在做什么。为此,您应该使用dynamic
从地图接收到的方法类型:
void printInt(int i) => print(i);
void printString(String s) => print(s);
void printSomething(Object o) {
final dynamic printer = {
int: printInt,
String: printString,
}[o.runtimeType];
print('Printer is $printer');
printer(o);
}
void main() => printSomething('Hello');
推荐阅读
- ios - 从 IOS 相机到 Azure 存储资源管理器的 Ionic 5 Blob 图像(请求发送错误)[在 Android 上工作,而不是 IOS]
- ruby-on-rails - 该文件被 Git 忽略,但不在 .gitignore 中
- python - 如何使用定义的函数两次而不会出错?
- r - 为什么在将使用 ggplot2 生成的图形转换为从 PowerPoint 传递的 pdf 时,我会得到颗粒状的图像?
- android - 如何获得 KProperty<*>?
- qt - QTabBar 'baseline' 样式
- c# - 有人知道如何在 Xamarin 中连接和读取 OBD-II (ELM 327) 吗?
- powershell - 在启动时制作不可见的 eShell(kiosk) 窗口
- c - 我试图遍历一个结构数组,并在我再次调用该函数(for循环)时从我离开的地方继续
- c++ - libnice - 访问套接字信息和 TURN 通道 ID