Почему нет ошибки типа
Тип проверяется в соответствии с array-element-type
массива:
(defparameter w (create-jvector :element-type 'fixnum))
(array-element-type (jvector-vector v))
=> T
(array-element-type (jvector-vector w))
=> FIXNUM
Нажатие символа на W
приводит к ошибке. Как сказал jkiiski, тип используется главным образом, чтобы помочь компилятору иметь возможность использовать специализированные представления для массивов (битвекторы, строки, ...).
integer
может быть bignum, поэтому тип обновленного элемента T
:
(upgraded-array-element-type 'integer)
=> T
Как решить вашу проблему
Это решение намекает jkiiski, а именно добавить тип в структуру; здесь я также переопределяю конструктор непосредственно из структуры:
(defstruct (j2vector
(:constructor make-jvector
(element-type
&aux
(start 0)
(vector (make-array 0
:adjustable t
:fill-pointer 0
:element-type element-type)))))
element-type
vector
(start 0 :type (integer 0)))
Затем вы явно проверяете тип:
(defun push-jvector (elt jvec)
(assert (typep elt (j2vector-element-type jvec)) ())
(vector-push-extend elt (j2vector-vector jvec)))