我有這個小代碼片段:
class A<T> {
A(this.a);
final T a;
}
void main() {
final a = A(true);
print(a);
print(a as A<bool>);
final b = A<Object>(true);
print(b);
print(b as A<bool>);
}
我b從一個庫/API接收物件A<Object>(我無法控制它),但我知道A<bool>在我的具體情況下它實際上是一個。我正在嘗試將其轉換為A<bool>(如在我的代碼片段中b)。但我收到一個錯誤,說這A<Object>不是A<bool>.
以下是上面粘貼的代碼片段的日志:
Instance of 'A<bool>'
Instance of 'A<bool>'
Instance of 'A<Object>'
Uncaught Error: TypeError: Instance of 'A<Object>': type 'A<Object>' is not a subtype of type 'A<bool>'
我怎樣才能將b(a A<Object>) 轉換為 a A<bool>?
uj5u.com熱心網友回復:
我怎樣才能將
b(aA<Object>) 轉換為 aA<bool>?
你不能。他們不是同一型別。
b被構造為 a A<Object>,因此它的運行時型別是A<Object>,無論是否b.a碰巧參考 a bool。強制as轉換會更改物件的靜態(編譯器已知)型別,但不能更改物件的運行時型別。如果您想要一個具有不同運行時型別的物件,則必須構造一個單獨的物件。
讓我們考慮一個稍微不同的例子:
class C<T> {
T value;
C(this.value);
}
C<T>是一樣的東西,A<T>只是它的成員不是final. 如果允許轉換運行時型別為C<Object>to的物件C<bool>,那么我們可以有以下內容:
final c = C<Object>(true);
final casted = c as C<bool>; // Should this be allowed?
c.value = 'Hello world!'; // Legal since `c.value` is of type `Object`.
bool someBool = casted.value; // ???
可以說,鑄造的情況A是不同的。A的成員是final,因此不會導致上述情況。但是,我希望這種例外會增加很多復雜性,并且可能會使事情變得更加混亂。
另見:https ://stackoverflow.com/a/67223011/
uj5u.com熱心網友回復:
下面的代碼可以轉換它。不知道它是否適用于您的情況。
var c = A<bool>(b.a as bool);
/// OR
extension Cast on A<Object> {
A<bool> cast() => A<bool>(a as bool);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/459956.html
