Създадох тип с помощта на 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.
^
пред#^
за въвеждане на метаданни за четец; старото значение на#^
е отхвърлено в 1.2. - person Michał Marczyk   schedule 27.07.2010