作者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