Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clojure: How to Case switch on Java Classes

Tags:

java

clojure

I have a java class in clojure, which comes from a method that returns classes. I want to case switch on these, like so:

            (case type
                java.lang.String (println "Found String" name)
                java.lang.Long (println "Found Long" name)
                java.nio.ByteBuffer (println "Found ByteBuffer" name)
                java.lang.Boolean (println "Found Boolean" name)
                java.math.BigDecimal (println "Found BigDecimal" name)
                java.lang.Double (println "Found Double" name)
                java.lang.Float (println "Found Float" name)
                java.net.InetAddress (println "Found InetAddress" name)
                java.lang.Integer (println "Found Integer" name)
                java.util.Date (println "Found Date" name)
                java.util.UUID (println "Found UUID" name)
                java.math.BigInteger (println "Found BigInteger" name)
                java.util.List (println "Found List" name)
                java.util.Set (println "Found Set" name)
                java.util.Map (println "Found Map" name))

But when I run this I get

 java.lang.IllegalArgumentException: No matching clause: class java.util.UUID

Which is what is thrown when no matching case is found. How do I match the class in the case clause?

like image 699
David Williams Avatar asked Apr 18 '26 22:04

David Williams


1 Answers

You can't really do any better than what cheshire does, which is basically repeated calls to instance?, like this:

(condp instance? x
  String :string
  Integer :int
  :unknown)

If you don't want to pay attention to subtyping, and use only an exact match on x's type, you can use (condp = (class x) ...) instead.

like image 58
amalloy Avatar answered Apr 20 '26 13:04

amalloy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!