Введите литерал nil в Clojure

Как указать тип аргумента для вызова функции, если передаваемый аргумент является литералом nil? Я столкнулся с ситуацией, когда я пытаюсь проксировать класс Java с несколькими конструкторами с одним аргументом, например:

public class MyClass {
  public MyClass(String a) {...}
  public MyClass(List b) {...}
}

Я хочу вызвать конструктор, который принимает строковый аргумент для моего прокси, но передает ему нулевое значение для этого аргумента. Просто вызов:

(proxy [MyClass] [nil] ...)

выдает исключение, потому что Clojure находит несколько конструкторов и не знает, какой из них вызывать. Но пытаюсь добавить подсказку типа, например:

(proxy [MyClass] [^String nil] ...)

выдает исключение с сообщением «Метаданные могут применяться только к IMetas». Достаточно справедливо - при чтении литерала nil читателю не к чему прикрепить метаданные. Итак, как я могу обойти это? Мне удалось найти решение с использованием let, но оно кажется довольно неуклюжим:

(let [NIL! nil]
  (proxy [MyClass] [^String NIL!] ...))

Есть лучший способ сделать это?


person Alex    schedule 07.11.2013    source источник


Ответы (1)


К сожалению нет,

Я не знаю лучшего способа. Иногда я делаю вызов proxy в функции, а затем вызываю ее, хотя это эквивалентно использованию вами let

person Arthur Ulfeldt    schedule 07.11.2013