我使用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"}
Run Code Online (Sandbox Code Playgroud)
显示的构造函数签名与提供的类型提示不匹配(它们Object用于String和Integer),我能够构造具有错误字段类型的对象.
我的代码有问题还是Clojure中的错误?
我在Clojure 1.2.0-beta1上.