作者godfat (godfat 真常)
看板PLT
標題Re: [問題] Scala 的 Covariant/Contravariant/Inv …
時間Wed Mar 18 13:35:12 2009
※ 引述《sbrhsieh (sbr)》之銘言:
: 如果你看到一個對 C pointer 沒有正確觀念的人,卻使用了 pointer 寫出拿石頭
: 往自己的腳砸的程式碼,你會說 C 語言有 pointer 似乎是沒意義的嗎?
雖然我覺得 c pointer 跟 java generic 不太能夠類比,因為 pointer 很難
做到良好的限制,使得不正確的操作有效被阻擋。但是 java generic 依照
scala 的作法,是能做到不錯的效果。不過我也同意你說對於 java generic
會使人砸自己的腳,而說 java generic 多出來的可能性沒有意義是不正確的。
以這樣的觀點來看,我覺得 java generic 倒是確實是不錯的。再加上也如同你
所說,如果我只需要用到 a.get(), 那確實也可以不用在乎 a.set(),
這樣彈性確實比單用 +T -T 要來得大上不少。
不過從另外一個角度來看,我覺得這樣的作法比較不像 java 平時的作法。
就我的感覺,java 一般而言是設計成讓你直覺而簡單地使用,而不是更多
更好更強大,卻有一點點風險的功能。或許也是因為這樣,而讓我一直不是
很確定 java generic 到底要做什麼吧?
還是或許說 java 想要一改以往的作法?就我所知,
近來唯一比較大的語法語意改變,正是 java generic?
: 你能不能把一個 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?
我覺得到了這邊的話,可能就要回頭來看 variance annotation 原本
所表達出的語意,也就是 A[+T] 時表示如果 U < T, 則 A[U] < A[T]
所以你能在 scala 裡做這件事,卻不能在 java 裡做:
val int_list: List[Integer] = List(1,2,3)
val any_list: List[Any] = int_list
雖然 java array 是可以的,因此 java array 本身似乎帶有 +T 的意義?
也就是說並不只是在 argument 上可以有 variance, value/variable 也是可以的。
--
「行け!Loki!」
(rocky ロッキー)
-Gurumin ぐるみん 王子? XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.128.121.85