2017-02-17 85 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中不允許超類型和子類型。在子類的上下文中使用泛型時,類型必須相同。