gpt4 book ai didi

types - Dart 运行时检查 switch 语句中的类型

转载 作者:行者123 更新时间:2023-12-01 23:46:23 25 4
gpt4 key购买 nike

我在尝试检查 Dart 中某些对象的运行时类型时发现了一些奇怪的行为。我们举一个简单的例子:

main(List<String> args) {
List<Map> l1 = new List<Map>();
l1.add(new Map<String, int>());
List<int> l2 = ['Start', 'Stop'];
checkType(l1.runtimeType);
checkType(l1[0].runtimeType);
checkType(l2.runtimeType);
}

checkType(Type type) {

switch(type) {
case List:
print('it is a List!');
break;
case Map:
print('it is a List!');
break;
default:
print('Unmanaged type $type');
break;
}
}

该程序有以下输出:

非托管类型 List<Map>非托管类型_InternalLinkedHashMap<String, int>非托管类型List

无法在 switch 语句中检查第一种情况,因为如果我尝试设置“List<Map> ”情况,则会收到错误:在常量表达式中,此运算符的操作数必须为“num”类型第二个无法匹配,因为在 case 中使用 _InternalLinkedHashMap 会出现以下错误:Case 表达式必须是常量。

在最后一种情况下,我将列表定义为整数列表( List<int> ),但系统忽略它并将其视为简单列表。我认为这是一种误导,这样的声明应该被禁止。

有什么帮助/建议吗?

最佳答案

如果你想根据对象的类型进行流控制,你实际上是想根据对象的类是否实现接口(interface)来进行控制,而不是根据它的运行时类型来进行。这就是类型测试运算符 isis! 的用途。

请记住,在 Dart 中,类也是一个接口(interface),因此您可以测试对象是否是特定类。

class Something {
...
}

var s = new Something();
print(s is Something); // true

请注意,我们倾向于将“类”视为“类”,例如 ListMap,它们不是类,而是接口(interface)。任何返回此类实例(包括构造函数)的东西实际上都会返回一个实现该接口(interface)的类。

您可以使用泛型,但要小心。

void main() {

var a = [1, 2, 'three'];
print(a is List); // True
print(a is List<int>); // True!!!!
print(a is List<String>); // True!!!!

var b = new List<int>.from([1, 2, 3]);
print(b is List); // True
print(b is List<int>); // True
print(b is List<String>); // False
}

类可以通过显式实现接口(interface)、从实现它的类继承或通过混合来实现接口(interface)。

class Base {
void a() {}
}

class Mix {
void b() {}
}

class Mixed extends Base with Mix {}

class Explicit implements Base {
void a() {}
}

void main() {

var c = new Mixed();
print(c is Mixed); // True
print(c is Base); // True
print(c is Mix); // True

var d = new Explicit();
print(d is Base); // True
}

关于types - Dart 运行时检查 switch 语句中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38354210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com