这不起作用,因为SpecialController
不是单一类型。您可以将关联类型视为一种泛型。ASpecialController
及其SpecialValueType
为 an与a为 anInt
是完全不同的类型,就像一个完全不同的类型与.SpecialController
SpecialValueType
String
Optional<Int>
Optional<String>
正因为如此,强制转换为 没有任何意义SpecialValueType
,因为这会掩盖关联的类型,并允许您使用(例如) aSpecialController
及其SpecialValueType
为Int
a SpecialController
,而 a 为SpecialValueType
aString
是预期的。
正如编译器所建议的那样,唯一SpecialController
可以使用的方法是作为通用约束。您可以拥有一个通用的函数 over T
,其约束T
必须是 a SpecialController
。now的域T
涵盖 的所有各种具体类型SpecialController
,例如一种具有Int
关联类型,一种具有String
. 对于每个可能的关联类型,都有一个 distinct SpecialController
,并且通过扩展,一个 distinct T
。
进一步引出Optional<T>
类比。想象一下,如果您尝试做的事情是可能的。很像这样:
func funcThatExpectsIntOptional(_: Int?) {}
let x: Optional<String> = "An optional string"
// Without its generic type parameter, this is an incomplete type. suppose this were valid
let y = x as! Optional
funcThatExpectsIntOptional(y) // boom.