【问题标题】:How to dispatch multimethod on primitive types?如何在原始类型上调度多方法?
【发布时间】:2012-07-28 16:47:20
【问题描述】:

我希望我的程序在原始类型和它们的包装类之间表现不同,例如:

(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 guava 包装到 clojure 中。里面有一个原始库,比如Booleans、Dobules、Ints等。它们有一些共同的方法,所以我想试试multimethod。

【问题讨论】:

  • 您能解释一下您为什么要这样做吗?目前不可能对原语进行调度,但可能有一种实现相同目标的好方法(谷歌“XY问题”)

标签: clojure primitive-types multimethod


【解决方案1】:

不,目前不可能。函数(例如多方法调度函数)的 arg 要么是 Object(因此原语将被装箱)或原语 long/double(因此 Objects 将被拆箱)。您的方案需要一个函数,该函数可以采用其中一个并在函数内部保留该区别。

也就是说,无论您要解决的实际问题是什么,都可能有解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2018-11-03
    • 2012-04-15
    • 1970-01-01
    • 2019-01-12
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多