我使用defrecord
字段的类型提示创建了一个类型。然而,我发现这些类型提示并没有在构造函数中强制执行,我可以用它们做一些奇怪的事情。例如,请看下面的代码片段:
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"}
显示的构造函数签名与提供的类型提示不匹配(它们Object
同时用于String
和Integer
),并且我能够构造具有错误字段类型的对象。
我的代码有问题还是 Clojure 中的错误?
我在 Clojure 1.2.0-beta1 上。