Используя тип подсказывает в Clojure для возвращаемых значений Java

Я работаю над некоторым Java / совместимость Clojure и столкнулся с предупреждением отражения для следующего кода:

(defn load-image [resource-name]
  (javax.imageio.ImageIO/read 
    (.getResource 
      (class javax.imageio.ImageIO) 
      resource-name)))

=> Reflection warning, clojure/repl.clj:37 - reference to field read can't be resolved.

Я удивлен этим, потому что getResource всегда возвращает URL, и я поэтому ожидал бы, что компилятор будет использовать соответствующий статический метод в javax.imageio. ImageIO/read.

Код хорошо работает BTW, таким образом, он ясно находит правильный метод во время выполнения.

Так два вопроса:

  1. Почему это возвращает отражательное предупреждение?
  2. Какая подсказка типа я должен зафиксировать это?
11
задан mikera 1 June 2010 в 22:53
поделиться

2 ответа

AFAICS это не имеет никакого отношения к вашему коду или компиляции. Это часть функции source-fn в REPL :

 ...
      (let [text (StringBuilder.)
            pbr (proxy [PushbackReader] [rdr]
                  (read [] (let [i (proxy-super read)]
                             (.append text (char i))
                             i)))]
 ...

и используется для отображения исходного кода в оболочке REPL, AFAICT.

4
ответ дан 3 December 2019 в 11:20
поделиться

Для тех, кто нашел этот пост (как и я) и задается вопросом, почему они получают предупреждения об отражении при использовании proxy-super ...

Каждый метод прокси имеет неявное this first arg, который, увы, не имеет типовой подсказки (предположительно потому, что прокси-сервер реализует ряд возможных типов, а результирующий прокси-класс создается позже).

Итак, если вы когда-нибудь вызовете методы на this изнутри прокси (что и делает proxy-super ), вы увидите предупреждения об отражении.

Простое решение - просто заключить ваш код в let , который использует подсказку типа. Например: [

(let [^SomeClass this this]
  (proxy-super foo)
  (.bar this))
2
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: