看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《whoowh (AA)》之銘言: : → loveme00835:你所謂的"直觀"實際上是對語意上的誤解, Derived is a 06/07 13:14 : → loveme00835:Base 物件, 但 Derviced '物件陣列' is not a Base 06/07 13:14 : → loveme00835:'物件陣列', 再來就是對陣列做 [] 取值行為, 則是假設 06/07 13:15 其實重點都被別人講完了,這邊稍微補充一下... 之所以 A 繼承 B 時一般來說 A 陣列不算繼承 B 陣列,是因為陣列 可以寫。如果今天是只能讀的陣列,那元素型態在正的位置(因為元素型 態愈自由,輸出的函式愈好寫),所以是 A 陣列可以算繼承 B 陣列。如 果今天是只能寫的陣列,則元素型態在負的位置(因為元素型態愈自由, 寫入的函式拿到的資料就愈少,程式愈難寫),所以 B 陣列可以算繼承 A 陣列。如果可以讀又可以寫,則陣列之間不能有什麼有趣的繼承關係。 有三個術語在講這件事情,唯讀陣列對元素型態來說 covariant, 只 能寫的陣列對元素型態來說 contravariant, 第三種,也就是你用的陣列 對元素型態應該要是 invariant. 這不是什麼語法強加的限制,而是本來 就不能亂轉。 是說 Java 的設計犯了這種錯誤 [1] ,不知道 Scala 有沒有改掉。 [1] http://c2.com/cgi/wiki?JavaArraysBreakTypeSafety -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.39 ※ 編輯: Favonia 來自: 140.112.30.39 (06/08 03:27)
loveme00835:網站不錯 :) 06/08 08:18
Chikei:改了,compiler會明確的講Array是invariant in T 06/08 14:57
※ 編輯: Favonia 來自: 140.112.30.39 (06/08 16:50)