如何在Dart中执行运行时类型检查?

时间:2011-10-10 16:39:13

标签: dynamic dart instanceof dart-mirrors

Dart规范声明:

  

Reified类型信息反映了运行时对象的类型,并且可能始终通过动态类型检查构造进行查询(   其他语言中的instanceOf,casts,typecase等类似物。)

听起来不错,但没有instanceof - 类似的运营商。那么我们如何在Dart中执行运行时类型检查?它有可能吗?

10 个答案:

答案 0 :(得分:67)

在Dart中,instanceof-operator被称为is。规范对于一个随意的读者来说并不是很友好,所以现在最好的描述似乎是http://www.dartlang.org/articles/optional-types/

以下是一个例子:

class Foo { }

main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
}

答案 1 :(得分:15)

正如其他人所提到的,Dart的is运算符相当于Javascript的instanceof运算符。但是,我还没有找到Dart中typeof运算符的直接类比。

值得庆幸的是,dart:mirrors reflection API最近已添加到SDK中,现在可以在latest Editor+SDK package下载了。这是一个简短的演示:

import 'dart:mirrors'; 

getTypeName(dynamic obj) {
  return reflect(obj).type.reflectedType.toString();
}

void main() {
  var val = "\"Dart is dynamically typed (with optional type annotations.)\"";
  if (val is String) {
    print("The value is a String, but I needed "
        "to check with an explicit condition.");
  }
  var typeName = getTypeName(val);
  print("\nThe mirrored type of the value is $typeName.");
}

答案 2 :(得分:9)

Dart Object类型有一个runtimeType个实例成员(来自dart-sdk v1.14,不知道它是否早先可用)

class Object {
  //...
  external Type get runtimeType;
}

用法:

Object o = 'foo';
assert(o.runtimeType == String);

答案 3 :(得分:8)

有两个用于类型测试的运算符:E is T测试E是类型T的实例,而E is! T测试E 不是类型为T的实例。

请注意,E is Object始终为true,null is T始终为false,除非T===Object

答案 4 :(得分:6)

通过 runtimeType 属性完成精确类型匹配,使用 is 运算符检查实例或任何父级(在继承链中)是否属于给定类型:

class xxx {}

class yyy extends xxx {}

void main() {
  var y = yyy();
  
  print(y is xxx);
  print(y.runtimeType == xxx);
}

返回:

true
false

答案 5 :(得分:5)

只需澄清一下isruntimeType之间的区别。正如某人已经说过的(并且已经使用Dart V2 +进行了测试),以下代码:

class Foo { 
  Type get runtimeType => String;
}
main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
  print("type is ${foo.runtimeType}");

}

将输出:

it's a foo! 
type is String

这是错误的。 现在,我看不出为什么要这样做的原因...

答案 6 :(得分:4)

object.runtimeType返回对象的类型

例如:

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double

答案 7 :(得分:0)

一个小包装可以帮助解决一些问题。

import 'dart:async';

import 'package:type_helper/type_helper.dart';

void main() {
  if (isTypeOf<B<int>, A<num>>()) {
    print('B<int> is type of A<num>');
  }

  if (!isTypeOf<B<int>, A<double>>()) {
    print('B<int> is not a type of A<double>');
  }

  if (isTypeOf<String, Comparable<String>>()) {
    print('String is type of Comparable<String>');
  }

  var b = B<Stream<int>>();
  b.doIt();
}

class A<T> {
  //
}

class B<T> extends A<T> {
  void doIt() {
    if (isTypeOf<T, Stream>()) {
      print('($T): T is type of Stream');
    }

    if (isTypeOf<T, Stream<int>>()) {
      print('($T): T is type of Stream<int>');
    }
  }
}

结果:

B<int> is type of A<num> B<int> is not a type of A<double> String is type of Comparable<String> (Stream<int>): T is type of Stream (Stream<int>): T is type of Stream<int>

答案 8 :(得分:0)

只需致电

打印(unknownDataType.runtimeType)

关于数据。

答案 9 :(得分:-1)

print("请输入您的电话号码:\n"); var 电话号码 = stdin.readLineSync();

if(phone number.runtimeType is int == true)     // checks if the values input are integers
{
print('you have successfully input your phone number!');
}
else{
print('only numbers are allowed');
}