HashMap 的类型提示

23 views
Skip to first unread message

刘杰

unread,
Feb 27, 2014, 10:09:31 AM2/27/14
to cn-cl...@googlegroups.com
大家好,

我问个关于类型提示的问题:

在 java 中用 java.util.HashMap 的时候,通常会用范型指定 key 和 value 的类型,在 Clojure 中获取 key 或 value 时,如果没有提示类型,会不会也用反射去还原?如果要对 key 和 value 用类型提示应该怎么写?谢谢!

dennis zhuang

unread,
Feb 27, 2014, 11:01:12 AM2/27/14
to cn-cl...@googlegroups.com
为什么要反射去还原?

user=> (set! *warn-on-reflection* true)
true
user=> (def ^java.util.Map x (doto (java.util.HashMap.) (.put :a 1) (.put 3 4)))
#'user/x
user=> (.get x :a)
1
user=> (.get x 3)
4
真正可能需要用到反射的地方是你取出来值后,拿这个值做什么,这时候type hint就派上用场了。

Java的泛型是擦拭法实现的,主要为了编译期尽早发现错误,运行时都没了。对于clojure来说,动态类型是默认,也没有必要泛型了。


--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 cn-clojure+...@googlegroups.com
要向此网上论坛发帖,请发送电子邮件至 cn-cl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/cn-clojure。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。



--
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008


Sun Ning

unread,
Feb 27, 2014, 10:45:40 PM2/27/14
to cn-cl...@googlegroups.com, dennis zhuang
嗯,java的泛型是编译期的,编译之后就没有了,clojure是看不到泛型的

On Fri 28 Feb 2014 12:01:12 AM CST, dennis zhuang wrote:
> 为什么要反射去还原?
>
> user=> (set! *warn-on-reflection* true)
> true
> user=> (def ^java.util.Map x (doto (java.util.HashMap.) (.put :a 1)
> (.put 3 4)))
> #'user/x
> user=> (.get x :a)
> 1
> user=> (.get x 3)
> 4
> 真正可能需要用到反射的地方是你取出来值后,拿这个值做什么,这时候type
> hint就派上用场了。
>
> Java的泛型是擦拭法实现的,主要为了编译期尽早发现错误,运行时都没了。对
> 于clojure来说,动态类型是默认,也没有必要泛型了。
>
>
> 在 2014年2月27日 下午11:09,刘杰 <lji...@gmail.com
> <mailto:lji...@gmail.com>>写道:
>
> 大家好,
>
> 我问个关于类型提示的问题:
>
> 在 java 中用 java.util.HashMap 的时候,通常会用范型指定 key 和
> value 的类型,在 Clojure 中获取 key 或 value 时,如果没有提示类
> 型,会不会也用反射去还原?如果要对 key 和 value 用类型提示应该怎么
> 写?谢谢!
>
> --
> 中文社区博客:http://blog.clojure.cn/
> 中文问答网站:http://ask.clojure.cn/
> 中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
> 要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到
> cn-clojure+...@googlegroups.com
> <mailto:cn-clojure%2Bunsu...@googlegroups.com>。
> 要向此网上论坛发帖,请发送电子邮件至 cn-cl...@googlegroups.com
> <mailto:cn-cl...@googlegroups.com>。
> 通过以下网址访问此论坛:http://groups.google.com/group/cn-clojure
> 要查看更多选项,请访问 https://groups.google.com/groups/opt_out
>
>
>
>
> --
> 庄晓丹
> Email: killm...@gmail.com <mailto:killm...@gmail.com>
> xzh...@avos.com <mailto:xzh...@avos.com>
> Site: http://fnil.net <http://fnil.net>
> Twitter: @killme2008
>
>
> --
> 中文社区博客:http://blog.clojure.cn/
> 中文问答网站:http://ask.clojure.cn/
> 中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
> 要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 cn-
> clojure+u...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages