swift - 在数组中使用泛型父类(super class)型

标签 swift generics

我有一个关于 Swift 泛型的问题。为什么这不可能?

class GenerifiedClass<T> {
    func doSomething(thing: T) {
        print("doing something with \(thing)")
    }
}

class SuperType {}
class TypeA: SuperType {}
class TypeB: SuperType {}
class TypeC: SuperType {}

let a = GenerifiedClass<TypeA>()
let b = GenerifiedClass<TypeB>()
let c = GenerifiedClass<TypeC>()

let array: [GenerifiedClass<SuperType>] = [a, b, c]   // compile error

澄清我的问题:为什么我不能将数组输入为 [GenerifiedClass<SuperType>] ?我有点知道为什么,因为例如在 Java 中这也是不可能的。但至少在 Java 中有解决这个问题的语法:

List<? extends SuperType> list = new ArrayList<>()

Swift 中是否有相当于 <? extends SuperType> 的内容在Java 中?

最佳答案

这与 Swift 中泛型的协方差有关。基本上GenerifiedClass<SuperType>不是 GenerifiedClass<TypeA> 的父类(super class),但只是一个兄弟类,这就是为什么你不能在需要使用多态性的地方使用它。

回答extends问题,是的,这在 Swift 中也是可能的:

class SuperType {}
class TypeA: SuperType {}
class TypeB: SuperType {}
class TypeC: SuperType {}

let a = TypeA()
let b = TypeB()
let c = TypeC()

let array: Array<SuperType> = [a, b, c]

,或

let array: [SuperType] = [a, b, c]

关于swift - 在数组中使用泛型父类(super class)型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902912/

相关文章:

c# - 属性中的类型约束

java - 使用泛型返回列表的接口(interface)会导致警告

java - 带有map java的通用方法

swift - 如何在 MVVM 中将 PublishSubject 呈现为 Observable?

ios - 不应该的不可变属性

Java:不能泛型 List<?扩展父> mylist

c# - 无法在列表 C# 中保存通用接口(interface)实现

swift - 无法将类型 'UITableViewCell' (0x10f16f778) 的值转换为 'ProjectName.MyCustomCell' (0x10cc5a568)

ios - 在 UITableView 中选择一个单元格,另一个单元格会受到影响

arrays - Swift 中数组的简单 "splice"类型方法?