Dart泛型没有根据文档具体化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart泛型没有根据文档具体化相关的知识,希望对你有一定的参考价值。

我正在尝试传递一个类型以便使用类型信息,但这些类型似乎没有通过。

我回到文档中仔细检查Dart泛型实际上已经具体化,根据文档,它们是:

enter image description here

我在响应上调用hydrate来变形响应对象的内容:

response.hydrate<BoqVO>();

我期待TBoqVO类型:

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.runtimeTypeT视为表达式。当包含类型参数的类型用作表达式时,它将计算类Type的实例。你打印的是Type对象的运行时类型(其中_TypeType的内部平台实现)。要打印真实类型,只需print(T)(仍然将T转换为Type对象,但代表BoqVO类型和toString包含BoqVO名称)。

同样对于T is BoqVO,你将T评估为Type对象,并且因为Type没有实现BoqVO,所以该测试总是错误的。没有简单的方法来测试类型参数的类型是否实现了特定的其他类型,但你可以像<T>[] is List<BoqVO>一样破解它。

以上是关于Dart泛型没有根据文档具体化的主要内容,如果未能解决你的问题,请参考以下文章

尝鲜 Dart 2.7 最新语法之泛型强化:声明处型变

尝鲜 Dart 2.7 最新语法之泛型强化:声明处型变

Dart 泛型编程

amdcpu不支持dart

Dart泛型

在泛型方法中返回特定类型,具体取决于运行时没有反射或动态的枚举值