Dart泛型没有根据文档具体化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart泛型没有根据文档具体化相关的知识,希望对你有一定的参考价值。
我正在尝试传递一个类型以便使用类型信息,但这些类型似乎没有通过。
我回到文档中仔细检查Dart泛型实际上已经具体化,根据文档,它们是:
我在响应上调用hydrate来变形响应对象的内容:
response.hydrate<BoqVO>();
我期待T
是BoqVO
类型:
class Response {
...
void hydrate<T>() {
print(T.runtimeType); // always prints _Type
if (T is BoqVO) {
print("IF");
} else {
print("ELSE"); // always goes into ELSE block
}
}
...
}
......但事实并非如此。
用response.hydrate<BoqVO>();
替换response.hydrate(new BoqVO());
并将方法签名更改为
void hydrate(T t) {
如果我现在使用小写的t
,但是不应该实例化该对象以使有效的泛型可用。
任何想法为什么Dart正在做这个或我缺少的具体的泛型工作正常?
PS:我还没上过Dart 2
,目前在Dart 1.24.3
上
从一开始就支持通用集合,并且它们获得了一些类型支持,但通用方法仅在Dart 1中进行了实验,并且仅在Dart 2预发布中添加了具体类型参数。
正如GüntherZöchbauer所说,类型参数在Dart 1.24中不起作用。
下面解释了如果你在Dart 2.0中尝试相同的代码会发生什么,它也不会起作用,因为它不正确地使用了type参数。
代码T.runtimeType
将T
视为表达式。当包含类型参数的类型用作表达式时,它将计算类Type
的实例。你打印的是Type
对象的运行时类型(其中_Type
是Type
的内部平台实现)。要打印真实类型,只需print(T)
(仍然将T
转换为Type
对象,但代表BoqVO
类型和toString
包含BoqVO
名称)。
同样对于T is BoqVO
,你将T
评估为Type
对象,并且因为Type
没有实现BoqVO
,所以该测试总是错误的。没有简单的方法来测试类型参数的类型是否实现了特定的其他类型,但你可以像<T>[] is List<BoqVO>
一样破解它。
以上是关于Dart泛型没有根据文档具体化的主要内容,如果未能解决你的问题,请参考以下文章