考慮以下類:
class MyClass<T extends num> {
const MyClass();
void instanceFunction() {}
static void staticFunction<T extends num>() {}
}
以下運算式都是true:
identical(const MyClass(), const MyClass<num>());
identical(const MyClass.new(), const MyClass<num>.new());
identical(const MyClass().instanceFunction, const MyClass<num>().instanceFunction);
identical(MyClass.new, MyClass.new);
identical(MyClass<num>.new, MyClass<num>.new);
identical(MyClass.staticFunction, MyClass.staticFunction);
identical(MyClass.staticFunction<num>, MyClass.staticFunction<num>);
但是當基本型別 ,num包含在一個可撕下時,例如在下面的運算式中,它們是false:
identical(MyClass.new, MyClass<num>.new);
identical(MyClass.staticFunction, MyClass.staticFunction<num>);
為什么會這樣?
uj5u.com熱心網友回復:
true案例:
identical(const MyClass(), const MyClass<num>());
你實體化一個MyClass物件。由于MyClass是用 宣告的MyClass<T extends num>,MyClass()沒有指定顯式型別是 的簡寫MyClass<num>()。因此,這個運算式與 相同identical(const MyClass<num>, const MyClass<num>),這顯然應該是正確的。
identical(const MyClass.new(), const MyClass<num>.new());
這只是前一個案例的一個更迂回的版本。
identical(const MyClass().instanceFunction, const MyClass<num>().instanceFunction);
出于與第一種情況相同的原因,這是正確的。const MyClass()是 的簡寫const MyClass<num>(),const實體被規范化,因此您正在比較.instanceFunction完全相同物件的成員。
identical(MyClass.new, MyClass.new);
兩個引數都是相同的,并且在編譯時都是靜態已知的,因此沒有理由認為這是錯誤的。
identical(MyClass<num>.new, MyClass<num>.new);
出于與前一個案例相同的原因,這將是正確的。
identical(MyClass.staticFunction, MyClass.staticFunction);` identical(MyClass.staticFunction<num>, MyClass.staticFunction<num>);
兩個論點identical是相同的,因此這些評估結果true應該不足為奇。
false案例:
identical(MyClass.new, MyClass<num>.new); identical(MyClass.staticFunction, MyClass.staticFunction<num>);
MyClass.new和MyClass.staticFunction不是和的簡寫;它們評估為通用函式:MyClass<num>.newMyClass.staticFunction<num>
var c1 = MyClass.new;
var c2 = MyClass<num>.new;
var f1 = MyClass.staticFunction;
var f2 = MyClass.staticFunction<num>;
那么is的型別和c1isMyClass<T> Function<T extends num>()的型別。同樣,is的型別但 is 的型別。并且仍然是通用的;你可以做或稍后。c2MyClass<num> Function()f1void Function<T extends num>()f2void Function()c1f1c1<num>()f2<double>()
c2并且f2已經靜態系結了型別引數,因此它們具有不同的型別,并且顯然不應該分別與c1和f1相同。
一個更有趣的案例是:
identical(f1<num>, MyClass.staticFunction<num>))
評估為false。為什么這和identical(MyClass.staticFunction<num>, MyClass.staticFunction<num>)案子不一樣?我不確定究竟是為什么,但我認為這是 Dart 編譯器的一個實作細節,能夠MyClass.staticFunction<num>在編譯時進行簡單的規范化,但不是f1<num>由于f1潛在的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497912.html
標籤:镖
上一篇:顫振選單欄
下一篇:顫振:從firebase云存盤中檢索檔案夾名稱時,未初始化lateinitializationerror欄位“listResult”
