泛型类中的变量类型错误

时间:2016-02-11 11:46:00

标签: swift generics

请考虑以下课程:

// Models:
class A {}
class B: A { }
class C: B { }

// Cache:
class AbstractCache<T> {}

// Services:
class AbstractService<T> {
    let cache = AbstractCache<T>()
}
class ServiceA<T: A>: AbstractService<T> {}
class ServiceB<T: B>: ServiceA<B> {}
class ServiceC<T: C>: ServiceB<C> {}

现在我这样做了:

let serviceC = ServiceC()
print(serviceC.cache.dynamicType)

我希望得到AbstractCache<C>.Type,但我会得到AbstractCache<B>.Type。为什么会发生这种情况?如何在cache类实例中获取ServiceC变量的正确类型?

2 个答案:

答案 0 :(得分:3)

这是因为您明确地使用ServiceA键入B。您应该使用T键入它以按您希望的方式运行。

尝试下面的代码,它可能会像你期待的那样工作。

// Tested @ Playground
class ServiceA<T: A>: AbstractService<T> {}
class ServiceB<T: B>: ServiceA<T> {}
class ServiceC<T: C>: ServiceB<T> {}

let serviceC = ServiceC()
print(serviceC.cache.dynamicType)

// prints "AbstractCache<C>\n"

答案 1 :(得分:2)

这些行:

class ServiceB<T: B>: ServiceA<B> {}
class ServiceC<T: C>: ServiceB<C> {}

需要:

class ServiceB<T: B>: ServiceA<T> {}
class ServiceC<T: C>: ServiceA<T> {}

如果您希望正确传递类型信息,则需要使用泛型类型T。然后你的限制将通过所有泛型级联。