dart - Dart 泛型没有根据文档具体化
问题描述
我正在尝试传递一个类型以使用类型信息,但该类型似乎没有被传递。
我回到文档仔细检查 Dart 泛型实际上是否被具体化,根据文档,它们是:
我在改变响应对象内容的响应上调用 hydra:
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 会这样做,或者我缺少什么让 reified 泛型正常工作?
PS:我还没在 Dart2
上,目前在 Dart1.24.3
解决方案
正如 Günther Zöchbauer 所说,类型参数在 Dart 1.24 中不起作用。
下面解释了如果你在 Dart 2.0 中尝试相同的代码会发生什么,它也不会工作,因为它错误地使用了类型参数。
代码T.runtimeType
视为T
表达式。当一个类型(包括一个类型参数)用作表达式时,它的计算结果是类的一个实例Type
。您打印的是该Type
对象的运行时类型(其中_Type
是 的内部平台实现Type
)。要打印真正的类型,只需print(T)
(它仍然转换T
为一个Type
对象,但一个表示类型BoqVO
并带有toString
包含BoqVO
名称的 a)。
同样对于T is BoqVO
,您评估T
为一个Type
对象,并且由于Type
未实现BoqVO
,因此该测试始终为假。没有简单的方法来测试类型参数的类型是否实现了特定的其他类型,但是您可以将其修改为<T>[] is List<BoqVO>
.
推荐阅读
- python - 使用 configparser 解析 ini 文件会给出 configparser.MissingSectionHeaderError 与 'ÿþ\n' 作为第一行
- c# - 绑定“找不到 CLR 属性”时出现 Avalonia UI 错误
- angular - 类型 'string' 不可分配给类型 'ArrayBuffer | 类数组
| 共享数组缓冲区' - java - 在 IBM Notes 中获取日期范围内的文档
- charts - Highchart - xAxis 每周日期可以从给定日期开始吗?
- c# - json数组解析错误,应用程序完成而没有读取整个请求体
- spring-boot - 在反向代理后面使用 OAuth2 的 Spring Boot
- kubernetes - kubectl 等待 --for=condition=complete --timeout=30s
- excel - Excel.Application:Microsoft Excel 无法访问文件 '[
]'有几个可能的原因: - json - 如何解决接口{}是字符串,而不是golang中的[]uint8?