首页 > 解决方案 > 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

标签: dart

解决方案


正如 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>.


推荐阅读