Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何使用Dart中的镜像获取泛型类型变量的具体类型?_Generics_Dart_Dart Mirrors - Fatal编程技术网

Generics 如何使用Dart中的镜像获取泛型类型变量的具体类型?

Generics 如何使用Dart中的镜像获取泛型类型变量的具体类型?,generics,dart,dart-mirrors,Generics,Dart,Dart Mirrors,假设我有一个像这样的字符串的列表 var myList=new List(); 我怎样才能知道myList是一个列表,由字符串组成,使用镜像 我使用ClassMirror的typeVariables尝试了它,但是mirror似乎只是描述了gernericList类 InstanceMirror im=reflect(myList);//“列表”实例上的InstanceMirror ClassMirror cm=im.type;//“列表”上的ClassMirror 打印(cm.typeVar

假设我有一个像这样的
字符串的
列表

var myList=new List();
我怎样才能知道
myList
是一个
列表
,由
字符串
组成,使用镜像


我使用
ClassMirror
typeVariables
尝试了它,但是mirror似乎只是描述了gerneric
List

InstanceMirror im=reflect(myList);//“列表”实例上的InstanceMirror
ClassMirror cm=im.type;//“列表”上的ClassMirror
打印(cm.typeVariables['E'])//在'E'上打印TypeVariableMirror
我在文档中也发现了这一点,但是我还没有找到一个
ClassMirror
实例,在这个实例中,访问
originalDeclaration
不会抛出
NoSuchMethodError

最终类镜像原始声明

此类型的原始声明上的镜像

对于大多数类,它们是它们自己的原始声明。通用的 但是,类与原始类之间有区别 声明,其中包含未绑定的类型变量和实例化 具有绑定类型变量的泛型类的

2种可能的方法

第一种方法是使用
is
运算符检查变量的类型,因为它比反射更有效:

var myList = new List<String>();
print(myList is List<int>); // false
print(myList is List<String>); // true
var myList=new List();
打印(我的列表是列表);//假的
打印(我的列表是列表);//真的
第二种方法是使用:

导入“dart:mirrors”;
var myList=新列表();
Map typeArguments=reflect(myList).type.typeArguments;
打印(类型参数);//{Symbol(“T”):字符串上的类镜像}
ClassMirror firstTypeArg=typeArguments[typeArguments.keys.first];
打印(firstTypeArg.reflectedType);//一串

FWIW我打开了这个bug来跟踪:您可能想启动它,以便在发生变化时获得通知。注意,您的示例应该更准确,并以此为例:
var myList=new List()
因为在Dart中,类型是可选的,所以您希望显示实际的对象实例化。@SethLadd谢谢您的回答。我相应地改变了我的例子。所以我猜答案应该是“在bug修复之前不可能实现”?那么这不应该是(被接受的)答案吗?我不完全肯定这是一个bug。一旦我们看到错误被分类并响应,我们就会知道答案:)
import 'dart:mirrors';
var myList = new List<String>();

Map typeArguments = reflect(myList).type.typeArguments;
print(typeArguments); // {Symbol("T"): ClassMirror on 'String'}

ClassMirror firstTypeArg = typeArguments[typeArguments.keys.first];
print(firstTypeArg.reflectedType); // String