我正在嘗試創建一個包含 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>?'.
我在這里做錯了什么?
更新: 第二種方法作業正常。
uj5u.com熱心網友回復:
您的第一次嘗試失敗,因為您執行以下操作:
factory CombinedResource.create(
Resource<Ta> rA,
Resource<Tb> rB,
) =>
CombinedResource._(
resourceA: rA,
resourceB: rB,
);
但CombinedResource._需要型別為T1and 的引數T2。您已指定 thatT1派生自 Resource<Ta>,這意味著 aT1的實體必須是 a 的實體Resource<Ta>。然而,反過來就不是這樣了:并非每個Resource<Ta>都必須是 a T1。因此 aResource<Ta>不能隱式分配給 a T1。(向下轉換可能不安全。)
我不知道為什么你莫名其妙地讓你的factory建構式使用與你的私有建構式不同的簽名,但如果你修復它以使用匹配型別,它會起作用:
factory CombinedResource.create(
T1 rA,
T2 rB,
) =>
CombinedResource._(
resourceA: rA,
resourceB: rB,
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386107.html
上一篇:NavigationLinkinit(_:destination:)已棄用
下一篇:RangeError(RangeError(index):Invalidvalue:Notininclusiverange0..1:2)使用兩個以上擴展面板串列時抖動
