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

看板PLT (程式語言與理論)作者 (godfat 真常)時間15年前 (2009/03/18 13:35), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串10/17 (看更多)
※ 引述《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
文章代碼(AID): #19m8WI7I (PLT)
討論串 (同標題文章)
文章代碼(AID): #19m8WI7I (PLT)