2012-07-28 33 views
8

Tôi muốn hành động chương trình của tôi khác nhau giữa các kiểu dữ liệu và các lớp wrapper của họ, ví dụ:Cách gửi đa phương thức trên các kiểu nguyên thủy?

(defmulti try-type class) 

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

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

Nhưng nó không hoạt động, mặc dù tôi cố gắng Integer và int cả

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

Vì vậy, là nó có thể gửi multimethod trên các loại nguyên thủy?

====== EDIT ======

tôi đã gói một quả ổi google vào clojure. Có một thư viện nguyên thủy trong nó, chẳng hạn như Booleans, Dobules, Ints vv Họ có một số phương pháp chung, vì vậy tôi muốn thử multimethod.

+0

bạn có thể giải thích lý do bạn muốn thực hiện việc này không? hiện đang gửi về nguyên thủy là không thể, nhưng có lẽ là một cách tốt để đạt được cùng một mục tiêu (google "XY Problem") – mikera

+0

@mikera edited! – qiuxiafei

Trả lời

4

Không, hiện không thể thực hiện được. Một hàm arg cho hàm (chẳng hạn như hàm dispatch multimethod) là một đối tượng (do đó các nguyên thủy sẽ được đóng hộp) hoặc một nguyên thủy dài/đôi (do đó các đối tượng sẽ được unboxed). Kịch bản của bạn yêu cầu một hàm có thể thực hiện hoặc duy trì sự phân biệt đó bên trong hàm.

Điều đó nói rằng, có thể có giải pháp cho bất kỳ vấn đề thực tế nào bạn đang cố giải quyết.

Các vấn đề liên quan