作者macbuntu (邀怪)
看板PLT
標題Re: [問題] Scala 的 Covariant/Contravariant/Inv …
時間Wed Mar 18 18:38:26 2009
※ 引述《sbrhsieh (sbr)》之銘言:
: // def showValue[V >: Any](obj:Value[V]) {
: // println(obj.get);
: // }
: // def showValue(obj:Value[Any]) {
: // println(obj.get);
: // }
: }
: class Value[T](init:T) {
: private var x:T = init
: def get:T = { x }
: def set(x:T) = { this.x = x}
: }
: 我發現我沒有辦法寫出一個 showValue method 可以讓我單純地把任一個 Value
: instance 所持有的 value 輸出,這是我欠缺某觀念,所以我寫不出來?還是?
: 這一點是我不滿意 scala 關於 subtyping variance 語法的原因之一。
你寫不出來是對的, 這就是 Scala 型別比 Java 嚴謹的關係.
你的 Value[T] 介面的設計, T 只能是 invariant, 所以將來使用 Value[T]
的地方, 也不可以隨便宣告成 covariant. 這就是所謂 vairant 由設計者來決定.
而 Java 就不管了, 你的 method 要把它當 covariant 用, 它就照樣給你用,
只是這樣的結果變成 set(T) 的部份沒辦法合理的 bind 到任何型別,
Java 就只好以例外來定義它只能以 set(null) 呼叫.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.132.21