Dart规范声明:
Reified类型信息反映了运行时对象的类型,并且可能始终通过动态类型检查构造进行查询( 其他语言中的instanceOf,casts,typecase等类似物。)
听起来不错,但没有instanceof
- 类似的运营商。那么我们如何在Dart中执行运行时类型检查?它有可能吗?
答案 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)
只需澄清一下is
和runtimeType
之间的区别。正如某人已经说过的(并且已经使用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');
}