面试题答案
一键面试- 能否赋值:
- 不能将
NSArray<SubClass *> *subArray
赋值给NSArray<SomeClass *> *array
。
- 不能将
- 原因:
- 在Objective - C轻量级泛型中,虽然
SubClass
是SomeClass
的子类,但泛型类型是不具备协变性的。从类型安全角度考虑,如果允许这种赋值,可能会导致运行时错误。例如,假设可以将NSArray<SubClass *> *subArray
赋值给NSArray<SomeClass *> *array
,那么代码中可能会从array
中取出元素并当作SomeClass
类型处理,但实际元素是SubClass
类型。如果后续代码对这些元素进行只适用于SomeClass
的操作(而SubClass
没有重写这些操作),就可能引发运行时错误。
- 在Objective - C轻量级泛型中,虽然
- 这种限制的作用:
- 增强类型安全性:这种限制确保了在编译期就能检测出类型不匹配的问题,防止在运行时因为错误的类型操作而导致崩溃。通过严格限制泛型类型的赋值,开发者可以更准确地处理数据类型,减少潜在的错误。
- 明确代码意图:限制这种赋值使得代码的类型意图更加清晰。开发者必须清楚知道数组中元素的确切类型,而不是依赖于不明确的类型转换,从而提高代码的可读性和可维护性。