如何在飞镖中创建泛型 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._
需要 T1
和 T2
类型的参数。您已指定 T1
派生自 来自 Resource<Ta>
,这意味着 T1
的实例必须是 [=16] 的实例=].然而,反之则不然:并非每个 Resource<Ta>
都必然是 T1
。因此 Resource<Ta>
不能隐式分配给 T1
。 (向下转换可能不安全。)
我不知道你为什么莫名其妙地让你的 factory
构造函数使用与你的私有构造函数不同的签名,但如果你修复它以使用匹配类型,它就会起作用:
factory CombinedResource.create(
T1 rA,
T2 rB,
) =>
CombinedResource._(
resourceA: rA,
resourceB: rB,
);
我正在尝试创建一个 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._
需要 T1
和 T2
类型的参数。您已指定 T1
派生自 来自 Resource<Ta>
,这意味着 T1
的实例必须是 [=16] 的实例=].然而,反之则不然:并非每个 Resource<Ta>
都必然是 T1
。因此 Resource<Ta>
不能隐式分配给 T1
。 (向下转换可能不安全。)
我不知道你为什么莫名其妙地让你的 factory
构造函数使用与你的私有构造函数不同的签名,但如果你修复它以使用匹配类型,它就会起作用:
factory CombinedResource.create(
T1 rA,
T2 rB,
) =>
CombinedResource._(
resourceA: rA,
resourceB: rB,
);