作者sbrhsieh (sbr)
看板PLT
标题Re: [问题] Scala 的 Covariant/Contravariant/Inv …
时间Wed Mar 18 01:51:22 2009
※ 引述《godfat (godfat 真常)》之铭言:
: java 要求使用者自行决定 variance 的种类,
: 而 scala 则反过来要求设计者在设计的时候就说明清楚。
: 同时,明白表示 +T 只能用在 return type, -T 只能用在 parameter type.
: 也就是说,就这点上 scala 限制是比 java generic 要来得多。
: 然而 java 多出来可以做的事:
: : static void func(A<? extends Number> a) {
: : Number n = a.get(); // OK
: : a.set(n); // compile time error
: : a.set(123); // compile time error
: : a.set(new Object()); // compile time error
: : a.set(null); // only this is OK
: : }
: : 上面那个 func() 里面, 如果没有前三个 set() 呼叫, 是可以 compile 没问题的.
: : 但是 T 用在 parameter type 的时候根本不该允许 <? extends Number>
: [...其余见原文]
: 似乎是没什麽意义的... :s
如果你看到一个对 C pointer 没有正确观念的人,却使用了 pointer 写出拿石头
往自己的脚砸的程式码,你会说 C 语言有 pointer 似乎是没意义的吗?
如果上头的 func method 就是要那样子(all a.xxx(...) statements)使用 a 指涉
的 object,使用 scala 有办法设计出一个 class/interface A 能够让 func 同时
接受 A<Integer> A<Double> 等等 instance 吗?也是没办法。反过来说,如果
func method 就只有第一个 statement,那根本也不需要 class/interface A 一定
得是被设计成 covariant subtyping generic class/interface。
你能不能把一个 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?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.129.21
※ 编辑: sbrhsieh 来自: 218.173.129.21 (03/18 01:54)
※ 编辑: sbrhsieh 来自: 218.173.129.21 (03/18 02:01)