switch语句中的Dart runtimeType检查

7tofc5zh  于 2024-01-04  发布在  其他
关注(0)|答案(2)|浏览(148)

我发现了一些奇怪的行为,试图检查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 expression must be constant。
在最后一个例子中,我将List定义为int(List<int>)的List,但系统忽略了它,并认为它是一个简单的List。我认为这是误导,这样的声明应该被禁止。
任何帮助/建议?

c3frrgcw

c3frrgcw1#

如果你想根据对象的类型进行流控制,你实际上是想根据对象的类是否实现了 interface,而不是它的运行时类型。这就是Type Test Operatorsisis!的作用。
请记住,在Dart中,类也是一个接口,因此您可以测试对象是否是特定的类。

class Something {
 ...
}

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

字符串
请注意,我们倾向于认为是“类”的东西,如ListMap,不是类,它们是接口。任何返回此类示例的东西(包括构造函数)实际上返回实现接口的类。
你可以使用泛型,但要小心。

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
}

vc9ivgsu

vc9ivgsu2#

我们必须从对象中获取runtimetype

switch(type.runtimeType)

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

相关问题