我正在嘗試從混合型別串列創建泛型型別類串列。
它有效,但問題是每個Data
實體型別都是dynamic
.
class Data<T> {
final T value;
const Data(this.value);
}
final List<dynamic> bases = [...];
final List<Data> data = bases.map((b) {
return Data(b);
}).toList();
嘗試#2
class Data<T> {
final T value;
const Data(this.value);
}
final List<dynamic> bases = [...];
final List<Data> data = bases.map((b) {
final Type T = b.runtimeType;
return Data<T>(b);
}).toList(); // List<Data<dynamic>>
但它失敗了,原因是:The name 'T' isn't a type so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named
uj5u.com熱心網友回復:
泛型型別引數必須是靜態已知的(即在編譯時)。如果從異構 開始List<dynamic>
,則每個元素的靜態型別都是dynamic
,因此當您Data
從該元素構造物件時,它將是Data<dynamic>
。
如果您的異構串列的型別數量有限,您可以這樣做:
var data = <Data<dynamic>>[];
for (var b in bases) {
if (b is Foo) {
var d = Data(b); // `d` is of type `Data<Foo>`
data.add(d);
} else if (b is Bar) {
var d = Data(b); // `d` is of type `Data<Bar>`
data.add(d);
} else {
throw UnimplementedError('Unrecognized type: ${b.runtimeType}');
}
}
(請注意,如果您data.add(Data(b))
在上面執行此操作,Data
物件將被構造為Data<dynamic>
因為泛型型別引數將從data
(of type List<Data<dynamic>>
) 而不是 from推斷b
。)
否則你想要的實際上是不可能的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494767.html
下一篇:按下時按鈕顏色不會改變