看板 PLT 關於我們 聯絡資訊
※ 引述《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