Dart仕様の状態:
修正された型情報は、実行時のオブジェクトの型を反映し、常に動的な型チェック構造(他の言語のinstanceOf、キャスト、型ケースなどに類似)によって照会されます。
すばらしいですが、instanceof
のような演算子はありません。それでは、Dartでどのようにランタイムタイプチェックを実行しますか?まったく可能ですか?
Instanceof-operatorは、Dartではis
と呼ばれます。仕様はカジュアルな読者にとってはまったく友好的ではないため、現時点での最良の説明は http://www.dartlang.org/articles/optional-types/ のようです。
以下に例を示します。
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
}
Dart Object
タイプにはruntimeType
インスタンスメンバーがあります(ソースはDart-sdk
v1.14、それが以前に利用可能だったかどうかわからない)
class Object {
//...
external Type get runtimeType;
}
使用法:
Object o = 'foo';
assert(o.runtimeType == String);
他の人が述べたように、Dartのis
演算子はJavascriptの instanceof
演算子と同等です。ただし、Dartで typeof
演算子の直接の類似物は見つかりませんでした。
ありがたいことに Dart:mirrors reflection API が最近SDKに追加され、 最新のエディター+ SDKパッケージ でダウンロードできるようになりました。これは短いデモです:
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つの演算子があります:E is T
はT型のインスタンスをEに対してテストし、E is! T
テストE notタイプTのインスタンス.
ご了承ください E is Object
は常に真であり、null is T
は、T===Object
。
object.runtimeType
はオブジェクトのタイプを返します
例:
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
小さなパッケージは、いくつかの問題を解決するのに役立ちます。
_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>