【发布时间】:2017-01-29 03:10:34
【问题描述】:
我正在尝试创建一个类结构,该类结构具有一个具有泛型类型(具有类型约束)的类,用作另一个泛型类的泛型类型约束。一旦我尝试对第一个类型约束类进行子类化,该子类就不再可用于初始化第二个泛型类(但对第一个类工作正常)。这是一个简化的代码示例:
class DataClass {
var value: Int
required init(value: Int) {
self.value = value
}
}
class Thing: DataClass {
required init(value: Int) {
super.init(value: value)
}
}
class ThingWrapper<ThingDataType: Thing>: DataClass {
var thing: ThingDataType
required init(value: Int) {
thing = ThingDataType(value: value)
super.init(value: value)
}
}
class ThingWrapperList<ThingWrapperType: ThingWrapper<Thing>>: DataClass {
var things: [ThingWrapperType]
required init(value: Int) {
things = [ThingWrapperType]()
super.init(value: value)
}
}
这些工作正常:
var thingWrapper = ThingWrapper<Thing>(value: 42)
var thingWrapperList = ThingWrapperList<ThingWrapper<Thing>>(value: 42)
这样:
class NewThing: Thing {
required init(value: Int) {
super.init(value: value)
}
}
var newThingWrapper = ThingWrapper<NewThing>(value: 42)
但这会产生错误:
var newThingWrapperList = ThingWrapperList<ThingWrapper<NewThing>>(value: 42)
Error: 'ThingWrapperList' requires that 'ThingWrapper<NewThing>' inherit from 'ThingWrapper<Thing>'
那么我可以不使用内部类型泛型约束的子类吗?我可能可以通过摆脱“ThingWrapper”类来解决这个问题,但我试图模仿我的 JSON 格式,现在我很好奇我做错了什么。
【问题讨论】:
-
我认为你来自 java ;) - 更少的继承 - 可能更多的协议。
-
但为什么不只是简单的结构呢?
-
你有一个 json 格式的样本,你需要这么多泛型?
-
也许更面向协议的东西会更好,但这似乎仍然应该有效。任何想法为什么它不?
-
我没有:我得到了这个
class ThingWrapperList<K: Thing, T: ThingWrapper<K>>: DataClass {在操场上工作 - 没有语法兼容 - 但在运行时它会使编译器崩溃:(
标签: swift generics swift3 type-constraints