我有一個基于某種型別的泛型類,以及一個指定該型別的子類。但是,Swift 編譯器似乎無法將具有正確型別的父類向下轉換為子類。
我很驚訝,因為這似乎是一種合法的需求。
例如
class MyClass<T> {}
class ChildClass: MyClass<Double> {}
func test() {
let instance = MyClass<Double>()
let castedInstance: ChildClass = instance as! ChildClass
}
此代碼引發運行時錯誤:Could not cast value of type 'MyClass<Swift.Double>' (0x1f3e449f0) to 'ChildClass' (0x1024f58b0).
有沒有辦法以正確的方式施放它,還是由于某種原因被禁止?有什么我誤解了嗎?
uj5u.com熱心網友回復:
您似乎對繼承的作業方式有誤解。您不能使用型別轉換來轉換物件的型別,無論是向上轉換還是向下轉換。
當您嘗試轉換的物件被宣告/存盤為更通用的型別(例如父類)時,您只能使用向下轉換,但它可能包含更專業的實體(子類)。但是,您正在宣告一個父實體,然后嘗試將其向下轉換為子類。這永遠行不通,因為實體是不同的型別。
如果您宣告一個父型別別的變數,但為它分配一個子類實體,則您的示例有效。
func test() {
let instance: MyClass<Double> = ChildClass()
let castedInstance: ChildClass = instance as! ChildClass
}
uj5u.com熱心網友回復:
我會說你誤解了什么是鑄造。強制轉換向編譯器揭示了實際是什么。它不會改變那件事是什么。
因此,您不能instance強制轉換為 ChildClass,原因很簡單,它實際上不是ChildClass。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/497660.html
