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

问题描述 投票:1回答:2

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

我回到文档中仔细检查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
2个回答
1
投票

从一开始就支持通用集合,并且它们获得了一些类型支持,但通用方法仅在Dart 1中进行了实验,并且仅在Dart 2预发布中添加了具体类型参数。


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>一样破解它。

© www.soinside.com 2019 - 2024. All rights reserved.