如何在飞镖中创建泛型 class 泛型?

How to create a generic class of generics in dart?

我正在尝试创建一个 class "CombinedResource",它将包含 2 个属性,每个属性都是 "Resource".

现在资源class如下:

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

CombinedResource class如下:

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?'.

我尝试将 CombinedResource class 更改为如下所示:

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>?'.

我做错了什么?

更新: 第二种方法工作正常。

您的第一次尝试失败,因为您这样做了:

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

CombinedResource._ 需要 T1T2 类型的参数。您已指定 T1 派生自 来自 Resource<Ta>,这意味着 T1 的实例必须是 [=16] 的实例=].然而,反之则不然:并非每个 Resource<Ta> 都必然是 T1。因此 Resource<Ta> 不能隐式分配给 T1。 (向下转换可能不安全。)

我不知道你为什么莫名其妙地让你的 factory 构造函数使用与你的私有构造函数不同的签名,但如果你修复它以使用匹配类型,它就会起作用:

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