我正在制作自己的,List并希望添加邏輯以根據E.
E = int不是問題,但E = Map有不受歡迎的行為。
例如,我想對待所有的E = Map<int, int>,E = Map<int, String>和E = Map作為Map。然而,==并is似乎認為這3個是不同的。你能幫我解決這個問題嗎?
my_list.dart
class MyList<E> extends ListBase<E> {
final List<E> _list = <E>[];
MyList() {
print('E: $E');
if (E == int) {
print('int!!');
} else if (E == HashMap || E is HashMap) {
print('HashMap!!');
} else if (E == LinkedHashMap || E is LinkedHashMap) {
print('LinkedHashMap!!');
} else if (E == SplayTreeMap || E is SplayTreeMap) {
print('SplayTreeMap!!');
} else if (E == Map || E is Map) {
print('Map!!');
}
}
// Other methods...
}
my_list_test.dart
void main() {
test('Test MyList', () {
final MyList<int> list = MyList<int>();
final MyList<LinkedHashMap<int, String>> list1 =
MyList<LinkedHashMap<int, String>>();
final MyList<HashMap<int, String>> list2 = MyList<HashMap<int, String>>();
final MyList<Map<int, int>> list3 = MyList<Map<int, int>>();
final MyList<Map<int, String>> list4 = MyList<Map<int, String>>();
final MyList<Map> list5 = MyList<Map>();
});
}
實際結果
E: int
int!!
E: LinkedHashMap<int, String>
E: HashMap<int, String>
E: Map<int, int>
E: Map<int, String>
E: Map<dynamic, dynamic>
Map!!
? Test MyList
預期結果
E: int
int!!
E: LinkedHashMap<int, String>
LinkedHashMap!! // This is not shown in the actual result
E: HashMap<int, String>
HashMap!! // This is not shown in the actual result
E: Map<int, int>
Map!! // This is not shown in the actual result
E: Map<int, String>
Map!! // This is not shown in the actual result
E: Map<dynamic, dynamic>
Map!!
? Test MyList
uj5u.com熱心網友回復:
問題E is Map在于,如果物件具有指定的型別,則is運算子為 True,但型別E實際上不是型別,E而是型別Type。
if (E is Type) {
print('Type!!!');
}
問題E == Map在于它Map是一個原始型別,相當于Map<dynamic, dynamic>. 如果E是任何其他型別,Map您將得到錯誤。
你可以做的是檢查一個實體的型別E而不是E它本身。例如,類似:
void add(E element) {
if (element is Map) {
print('Map!!');
}
}
uj5u.com熱心網友回復:
這就是 Flutter/Dart 型別的作業原理。您不能使用泛型顯式檢查兩種型別(List 上的示例):比較
List<int>
和
List
將始終回傳 false。
如果你真的需要比較兩個泛型型別,那么你可以使用泛型幫助器將它們解包到 Type 并嘗試比較它們,例如通過字串表示。
幫手:
Type _unpackedType<T>() => T;
示例用法:
void _check<T>() {
print(_unpackedType<T>());
print(_unpackedType<List>());
}
void main() {
_check<List<int>>();
}
這將導致輸出為:
List<int>
List<dynamic>
不幸的是,這些型別無法顯式比較,因為由于 Dart 如何處理型別,結果總是為負數,但正如您所見,表示具有足夠的可比性,因此如果您需要如此嚴格的比較,您可以簡單地標準化輸出并洗掉型別字串的通用部分并比較型別字串表示。這將與任何泛型型別相關,并且適用于您的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408803.html
標籤:
