作者godfat (godfat 真常)
看板PLT
标题Re: [问题] Scala 的 Covariant/Contravariant/Inv …
时间Wed Mar 18 18:43:30 2009
※ 引述《sbrhsieh (sbr)》之铭言:
: formal parameter 本质上就是 local variable,所以在 Java 中也是可以这样做:
: java.util.List<Integer> int_list = new java.util.ArrayList<Integer>();
: java.util.List<? extends Object> any_list = int_list;
我没有想到,看来果然是不熟 java generic XD
这样说来的话,java generic 确实是 scala generic 的 superset, 对吗?
: 那反过来,如果假设 scala List 当初也是设计成 mutable 容器(也就是 List[T]),
: 那麽我可以在 Java 里这样子使用 local variable:
: java.util.List<Integer> int_list = new java.util.ArrayList<Integer>();
: java.util.List<? extends Object> any_list = int_list;
: System.out.println(any_list.get(0));
: 请问,在 scala 中该怎麽作?
就我目前所知,应该是做不到的。试了一下,这样的动作,
感觉像是一种 view, 也就是说把 java.util.List 本身变得像是 constant 一样。
严格来说,或许是禁止使用会需要 arguments 的 method 吧?
我不知道 scala 里面有没有简单的类似动作可以做到这件事,
这几天我想找找看 :D
: ========================================================================
: 一来一往到这一篇,我是觉得有点乱了,或许每个人想要交流的看法并没有真的
: 有交流到。
我倒觉得让我发现对 java generic 有相当程度的误解 XD
: Java Generics 最後采用的语法的确是不容易掌握(也就是不直觉),我认为会造成
: 这样子的原因在於,当初 Java team 进行引入 generics 的一个主要原则:
: 令 JVM (spec) 必要的修改最小,不是令它的语法既简单又美
虽然如果 java generic 真是 scala generic 的 superset,
那麽 scala generic 当然也是可以直接相容於 java generic,
也就是纯粹语法上(和某种程度上的解释方式)的差异了。
个人是觉得 java 的解释方式真的很难懂... :s
: 最後,我认为每一个 Java programmer,没有看过这两个 paper(除非完全不用到
: Java Generics)的人,都应该花时间看看:
: Adding Wildcards to the Java Programming Language
: http://www.jot.fm/issues/issue_2004_12/article5.pdf
: On Access Restriction with Java Wildcards
: http://www.jot.fm/issues/issue_2005_12/article6.pdf
虽然暂时不会有机会用到 java, 但有空我会翻一下的,感谢!
: 我发现我没有办法写出一个 showValue method 可以让我单纯地把任一个 Value
: instance 所持有的 value 输出,这是我欠缺某观念,所以我写不出来?还是?
: 这一点是我不满意 scala 关於 subtyping variance 语法的原因之一。
虽然可能不是你想的那样,不过:
class Value[+T](init:T) {
private
val x:T = init
def get:T = { x }
def set
[U >: T](x:
U): Value[U] =
new Value[U](x)
}
def showValue(obj:Value[Any]) {
println(obj.get);
}
这边的重点大概是,value 必须是 immutable 的。
至於这样效能会不会很差,也许吧,我不知道 XD
可以参考这篇:一个 immutable 的 stack.
http://www.scala-lang.org/node/129
functional programming 就是尽量避免 state.
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.121.85