代码之家  ›  专栏  ›  技术社区  ›  Mena

如何在dart中创建泛型类?

  •  1
  • Mena  · 技术社区  · 3 年前

    我正在尝试创建一个类 “组合资源” 将包含两个属性,每个属性的类型 “资源” .

    现在

    class Resource<T>{
      final T? data;
      Resource({this.data});
    }
    

    组合资源 课程安排如下:

    class CombinedResource<T1 extends Resource<Ta>, T2 extends Resource<Tb>, Ta, Tb>
     {
      final T1? resourceA;
      final T2? resourceB;
      
      const CombinedResource._({
        this.resourceA,
        this.resourceB,
      });
    
      factory CombinedResource.create(
        Resource<Ta> rA,
        Resource<Tb> rB,
      ) =>
          CombinedResource._(
            resourceA: rA,
            resourceB: rB,
          );
    }
    

    现在 编译器在工厂方法上给了我一个错误:

    The argument type 'Resource<Ta>' can't be assigned to the parameter type 'T1?'.
    

    我试着换衣服 组合资源

    class CombinedResource<Ta,Tb>
    {
      final Resource<Ta>? resourceA;
      final Resource<Tb>? resourceB;
      
      const CombinedResource._({
        this.resourceA,
        this.resourceB,
      });
    
      factory CombinedResource.create(
        Resource<Ta> rA,
        Resource<Tb> rB,
      ) =>
          CombinedResource._(
            resourceA: rA,
            resourceB: rB,
          );
    }
    

    这引起了另一个问题 问题 ,其中我无法创建CombinedResource的实例:

     CombinedResource.create(
                      Resource(data:"sdc"), Resource(data:"sdc"));
    
      The argument type 'String' can't be assigned to the parameter type 'Resource<String>?'.
    

    我做错了什么?

    更新: 第二种方法很有效。

    1 回复  |  直到 3 年前
        1
  •  2
  •   jamesdlin    3 年前

    您的第一次尝试失败,因为您执行了以下操作:

      factory CombinedResource.create(
        Resource<Ta> rA,
        Resource<Tb> rB,
      ) =>
          CombinedResource._(
            resourceA: rA,
            resourceB: rB,
          );
    

    但是 CombinedResource._ 需要类型为的参数 T1 T2 . 你已经指定了 T1 派生 从…起 Resource<Ta> ,这意味着 T1 资源<Ta> . 然而,情况并非相反:并非所有人都是如此 资源<Ta> 必然是一个 . 因此 不能隐式地分配给 . (降级可能不安全。)

    我不知道你为什么莫名其妙地做出了决定 factory

      factory CombinedResource.create(
        T1 rA,
        T2 rB,
      ) =>
          CombinedResource._(
            resourceA: rA,
            resourceB: rB,
          );
    
    推荐文章