Proposal: Comparables.isCommutativelyComparable
Aleksey Shipilev
aleksey.shipilev at oracle.com
Sat Jun 8 19:51:27 UTC 2013
Hm, sounds interesting.
What's about yet another "factory"-like default in Comparator:
Comparator<C> Comparator.make(Class<C> klass)
- returns synthetic comparator using C.compareTo iff C implements Comparable<C>
- returns null otherwise
That will naively instantiate the Comparator, but there is the possibility to reuse e.g. ClassValue to lazily associate the default comparator with the class.
-Aleksey.
On 08.06.2013, at 19:50, Doug Lea <dl at cs.oswego.edu> wrote:
>
> Suppose you have two objects, x and y, both of the same
> type (x.getClass() == y.getClass()) and both known
> to be instanceof Comparable.
>
> Can you compare them? That is, can you safely call
> (Comparable)x).compareTo(y);
>
> Almost always, the answer is yes, because almost all
> Comparable classes are of form "class C implements Comparable<C>"
>
> But there's nothing about interface Comparable that forces
> this to be true. It would be weird but legal if both
> are of form, say, "class C implements Comparable<Byte>".
> Which means that you cannot compare them to each other.
>
> There's currently no direct way to check if you have a normal
> commutative (bidirectionally applicable) pair of comparables.
>
> It can be checked using reflection though, using mechanics
> that are both messy and slower than they might be if
> implemented as a JDK utility method.
>
> There a few possible API choices for how to do this.
>
> The most basic is
>
> boolean isCommutativelyComparable(Class<C?> c);
>
> returning true if c represents a class form C implements Comparable<C>.
> (It would be OK although a little annoying to use if it restricted
> argument type to Class<Comparable<?>>.)
>
> A more general one is:
>
> Class<?> commutativelyComparableClassFor(Object x)
>
> that returns a class C such that
> (x instanceof C) and (C implements Comparable<C>)
> or null if there is no such class. The return type could
> be strengthened to Class<Comparable<?>>
>
> This allows use of the result to match up objects of
> subclasses of commutatively comparable classes.
>
> The most handy form is:
>
> int compareIfCommutativelyComparable(Comparable x, Comparable y);
>
> that returns compareTo result if both of same commutatively
> comparable type, else 0.
>
> Maybe this one is *too* handy though. It's not hard to
> get the same effect manually given the above methods.
>
> Does anyone have any thoughts about introducing at
> least the first, and possibly the others into the
> java.util.Comparables utility class? If so, there would
> be a few immediate usages within JDK.
>
> I'm surprised that this hasn't come up for consideration
> before. Or maybe I haven't noticed previous discussions?
>
> -Doug
>
>
>
More information about the core-libs-dev
mailing list