(defn sort-by-subsumption [classes]
(sort
(fn [^Class a ^Class b]
(cond
(.isAssignableFrom a b) 1 ; a is more general than b → b comes first
(.isAssignableFrom b a) -1 ; b is more general than a → a comes first
:else 0)) ; unrelated → keep original order
classes))
(prn
(sort-by-subsumption
#{java.lang.Object java.text.BreakIterator java.lang.Cloneable}))