2017-02-17 82 views
0

我有A类:斯威夫特泛型类不能分配给子类

class A<T: MyTypeClass> 
{ 
} 

和B类

class B<T: MyTypeClassSubclass>: A<T> 
{ 
} 

让我们说MyTypeClassSubclass延伸MyTypeClass

斯威夫特不让我去做一些事情吧:

var variable: A<MyTypeClass> = B<MyTypeClassSubclass>() 

,如果我写的东西,如:

var variable: A<MyTypeClass> = B<MyTypeClassSubclass>() as! A<MyTypeClass> 

编译器给出的只是一个警告,在运行应用程序崩溃。

我试过擦除类型,但它不起作用,因为在我的情况下,它是从类开始的巫婆已经是通用的了。

我该如何解决这个问题?

+1

This [Swift:将泛型类型转换为相同的泛型类型,但具有关联类型的子类](http://stackoverflow.com/questions/33752968/swift-cast-generic-type-in​​to-same-generic-type -but-with-a-sub-of-associate)可能会有所帮助 –

+1

尤其请参阅发表的博客文章。 https://www.mikeash.com/pyblog/friday-qa-2015-11-20-covariance-and-contravariance.html。简单的回答是,使这种协变是可能的(除了Swift以外的其他语言,如Scala),但它是一种复杂的语言功能,可以正确处理类型安全,而Swift没有它。你不能这样做。将子类与非平凡的泛型混合在一起会让你进入一个角落。一般来说,您应该重新设计协议或键入橡皮擦,而不是继承以避免这种情况。 –

回答

1

在处理通用类型时,Swift中不允许超类型和子类型。在子类的上下文中使用泛型时,类型必须相同。