Re: [問題] Scala 的 Covariant/Contravariant/Inv …

看板PLT (程式語言與理論)作者 (sbr)時間15年前 (2009/03/18 01:51), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串8/17 (看更多)
※ 引述《godfat (godfat 真常)》之銘言: : java 要求使用者自行決定 variance 的種類, : 而 scala 則反過來要求設計者在設計的時候就說明清楚。 : 同時,明白表示 +T 只能用在 return type, -T 只能用在 parameter type. : 也就是說,就這點上 scala 限制是比 java generic 要來得多。 : 然而 java 多出來可以做的事: : : static void func(A<? extends Number> a) { : : Number n = a.get(); // OK : : a.set(n); // compile time error : : a.set(123); // compile time error : : a.set(new Object()); // compile time error : : a.set(null); // only this is OK : : } : : 上面那個 func() 裡面, 如果沒有前三個 set() 呼叫, 是可以 compile 沒問題的. : : 但是 T 用在 parameter type 的時候根本不該允許 <? extends Number> : [...其餘見原文] : 似乎是沒什麼意義的... :s 如果你看到一個對 C pointer 沒有正確觀念的人,卻使用了 pointer 寫出拿石頭 往自己的腳砸的程式碼,你會說 C 語言有 pointer 似乎是沒意義的嗎? 如果上頭的 func method 就是要那樣子(all a.xxx(...) statements)使用 a 指涉 的 object,使用 scala 有辦法設計出一個 class/interface A 能夠讓 func 同時 接受 A<Integer> A<Double> 等等 instance 嗎?也是沒辦法。反過來說,如果 func method 就只有第一個 statement,那根本也不需要 class/interface A 一定 得是被設計成 covariant subtyping generic class/interface。 你能不能把一個 generic class/interface 宣告為 covariant or contravariant subtyping 是決定在此 class/interface 的規格上,不是在於你的意圖。而 client code 要設計成 covariant usage or contravariant usage,是決定在 client code 的意圖,而不是在於 A 是 A<+T>, A<-T> or A<T>。那為甚麼還需要 variance annotation? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.129.21 ※ 編輯: sbrhsieh 來自: 218.173.129.21 (03/18 01:54) ※ 編輯: sbrhsieh 來自: 218.173.129.21 (03/18 02:01)
文章代碼(AID): #19l-CTGz (PLT)
討論串 (同標題文章)
文章代碼(AID): #19l-CTGz (PLT)