【问题标题】:How to create a generic class of generics in dart?如何在 dart 中创建一个泛型的泛型类?
【发布时间】:2022-01-21 09:07:36
【问题描述】:

我正在尝试创建一个包含 2 个属性的类 "CombinedResource",每个属性的类型都是 "Resource"

现在Resource类如下:

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

CombinedResource类如下:

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

我在这里做错了什么?

更新: 第二种方法效果很好。

【问题讨论】:

  • 我无法重现您的第二个版本的任何问题。

标签: dart dart-generics


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多