Как говорит Амаллой, вы должны программировать не против этих точных типов, а против абстракции seq
.
Однако я думаю, что могу предположить причину.Формы Clojure, которые в конечном итоге вызывают PersistentList
, вызывают RT.java , в частности, метод cons(Object x, Object coll)
.Он начинается с довольно странной проверки: if(coll == null) return new PersistentList(x)
, после чего он создает объект Cons
, если эта проверка не проходит.Если вы посмотрите на более ранние версии кода , вы можете найти это:
static public IPersistentCollection cons(Object x, IPersistentCollection y) {
if(y == null)
return new PersistentList(x);
return y.cons(x);
}
Итак, в более ранней версии функции вызов был отправлен в метод cons
второй аргумент, поэтому случай, когда вторым аргументом был null
(т.е. nil
в Clojure), требовалась специальная обработка.Более поздние версии не выполняют эту диспетчеризацию (или фактически делают это, но другим способом, предположительно для поддержки большего разнообразия типов коллекций), но проверка была сохранена, поскольку она не нарушает никакого правильно написанного кода.