爲何泛型不支持協變性?

假設數組

class S { }
class A : S { }
class B : S { }

下面的代碼是能夠編譯經過的spa

S[] array = new A[5];
array[0] = new B();
List<S> list = new List<A>();

運行結果:.net

第一行代碼是能夠編譯經過的設計

第二行代碼運行時報錯code

第三行代碼編譯不經過。blog

問題1:爲何數組支持協變性?

由於Java有協變數組,因此.net的設計者的第一個版本時,也採起一樣的策略。雖然這個功能在Java中是一個公認的「瑕疵」編譯

問題2:爲何泛型不支持協變性?

泛型設計者認爲與其在運行失敗,不如在編譯時就失敗——靜態類型語言的所有意義在於代碼運行前找出錯誤。class

相關文章
相關標籤/搜索