我想在 Dart 中执行运行时子类型检查而不使用dart:mirrors
.
我的意思是,给定两种类型A
and B
,作为具有类型的变量Type
或作为泛型类上的类型参数(即,被检查的变量将是,List
用作虚拟类,List<A>
and List<B>
),我想检查是否A
是的一个亚型B
。
这是一些用它编写的代码,dart:mirrors
可以执行我想要的:
bool isSubtype(Type a, Type b) => reflectType(a).isSubtypeOf(reflectType(b));
// OR
bool isSubType<A, B>(List<A> a, List<B> b) => reflect(a).type.typeArguments[0].isSubtypeOf(reflect(b).type.typeArguments[0]);
我想在不使用dart:mirrors
. 我尝试使用以下代码:
bool isSubType<A, B>(List<A> a, List<B> b) => <A>[] is List<B>;
但是,虽然此代码适用于具有静态类型的表达式:
print(isSubType(<Iterable>[], <Iterable>[])); // true
print(isSubType(<Iterable>[], <List>[])); // true
print(isSubType(<Iterable>[], <String>[])); // false
它不适用于没有静态类型的表达式:
List a = <Iterable>[];
List<List> types = [<Iterable>[], <List>[], <String>[]];
for (final type in types) {
print(isSubType(type, a)); // true, true, true
}
对于编译时未知的类型,我该如何实现isSubType
以获得正确的结果?
注意:我不需要这个兼容 JS 运行时,只需要 AOT 和 JIT 编译的 Dart。