【发布时间】:2011-03-21 16:00:55
【问题描述】:
我使用带有字段类型提示的defrecord 创建了一个类型。然而,我发现这些类型提示并没有在构造函数中强制执行,我可以用它们做一些奇怪的事情。以下面的 sn-p 为例:
user=> (defrecord Person [#^String name #^Integer age])
user.Person
user=> (seq (.getConstructors Person))
(#<Constructor public user.Person(java.lang.Object,java.lang.Object,
java.lang.Object,java.lang.Object)>
#<Constructor public user.Person(java.lang.Object,java.lang.Object)>)
user=> (Person. (Integer. 123) "abhinav")
#:user.Person{:name 123, :age "abhinav"}
显示的构造函数签名与提供的类型提示不匹配(它们对String 和Integer 都使用Object)并且我能够构造具有错误字段类型的对象。
我的代码有问题还是 Clojure 中的错误?
我正在使用 Clojure 1.2.0-beta1。
【问题讨论】:
-
顺便说一句,如果你的代码依赖于 1.2 的特性,你应该更喜欢
^而不是#^来引入阅读器元数据;#^的旧含义在 1.2 中已弃用。
标签: clojure type-hinting