Как распределить мультиметод на примитивных типах?

Я хочу, чтобы моя программа действовала по-разному между примитивными типами и их классами-оболочками, например:

(defmulti try-type class)

(defmethod try-type Integer [arg]
  (println "Integer"))

(defmethod try-type Integer/TYPE [arg]
  (println "int"))

Но это не работает, хотя я пробую Integer и int как

user=> (try-type (.intValue (int 2)))
Integer
nil
user=> (try-type  (int 2))
Integer
nil

Итак, можно ли использовать мультиметод для примитивных типов?

====== РЕДАКТИРОВАТЬ ======

Я оборачивал гуаву Google в Clojure. В нем есть примитивная библиотека, такая как Booleans, Dobules, Ints и т. Д. У них есть несколько общих методов, поэтому я хочу попробовать мультиметод.


person qiuxiafei    schedule 28.07.2012    source источник
comment
не могли бы вы объяснить, почему вы хотите это сделать? в настоящее время отправка примитивов невозможна, но, вероятно, есть хороший способ достичь той же цели (проблема Google XY)   -  person mikera    schedule 30.07.2012


Ответы (1)


Нет, в настоящее время это невозможно. Аргумент функции (такой как функция мультиметодной диспетчеризации) является либо объектом (таким образом, примитивы будут упакованы), либо примитивом long / double (таким образом, объекты будут распакованы). Вашему сценарию требуется функция, которая может принимать любую из них и сохранять это различие внутри функции.

Тем не менее, могут быть решения любой реальной проблемы, которую вы пытаетесь решить.

person Alex Taggart    schedule 28.07.2012