沮丧的通用类

Big*_*Bro -2 inheritance swift

我有一个基于某种类型的泛型类,以及一个指定该类型的子类。然而,Swift 编译器似乎无法将具有正确类型的父类向下转换为子类。
我很惊讶,因为这似乎是一个合理的需求。

例如

class MyClass<T> {}

class ChildClass: MyClass<Double> {}

func test() {
  let instance = MyClass<Double>()
  let castedInstance: ChildClass = instance as! ChildClass
}
Run Code Online (Sandbox Code Playgroud)

此代码引发运行时错误:Could not cast value of type 'MyClass<Swift.Double>' (0x1f3e449f0) to 'ChildClass' (0x1024f58b0).

有没有办法以正确的方式施放它,或者由于某种原因被禁止?我有什么误解吗?

Dáv*_*tor 5

看来您对继承的工作原理存在误解。您无法使用类型转换来转换对象的类型,无论是向上转换还是向下转换。

仅当您尝试转换的对象被声明/存储为更通用的类型(例如父类)时,才能使用向下转型,但它可能包含更专门的实例(子类)。但是,您正在声明一个父实例,然后尝试将其向下转换为子类。这永远行不通,因为实例是不同类型的。

如果您声明父类类型的变量,但为其分配子类实例,则您的示例将有效。

func test() {
  let instance: MyClass<Double> = ChildClass()
  let castedInstance: ChildClass = instance as! ChildClass
}
Run Code Online (Sandbox Code Playgroud)