作者godfat (godfat 真常)
看板PLT
标题Re: [问题] Scala 的 Covariant/Contravariant/Inv …
时间Wed Mar 18 13:35:12 2009
※ 引述《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