Dart 运行时在 switch 语句中进行类型检查

问题描述 投票:0回答:2

我在尝试检查 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>
),但系统忽略它并将其视为简单列表。 我认为这是一种误导,这样的声明应该被禁止。

有什么帮助/建议吗?

types switch-statement dart
2个回答
8
投票

如果你想根据对象的类型进行流控制,你实际上是想根据对象的类是否实现了接口来进行流控制,而不是它的运行时类型。这就是 Type Test Operators

is
is!
的用途。

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

class Something {
 ...
}

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

请注意,我们倾向于认为“类”的东西(例如

List
Map
)不是类,它们是接口。任何返回此类实例(包括构造函数)的东西实际上都会返回一个实现该接口的类。

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

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
}

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

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
}

0
投票

我们必须从对象获取运行时类型

switch(type.runtimeType) 

检查此答案以供参考https://stackoverflow.com/a/71529798/8192246

© www.soinside.com 2019 - 2024. All rights reserved.