作者sbrhsieh (sbr)
看板PLT
標題Re: [問題] Scala 的 Covariant/Contravariant/Inv …
時間Wed Mar 18 01:51:22 2009
※ 引述《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)