package org.squirrelframework.foundation.util;
import java.io.Serializable;
import java.util.Comparator;
/**
* Orders classes by assignability, with closest types ordered first.
*
* @author Henry.He
*
* @param <T> type of object to compare
*/
public class ClassComparator<T> implements Comparator<T>, Serializable {
private static final long serialVersionUID = 7351750287378530968L;
@Override
public int compare(T o1, T o2) {
Class<?> c1 = o1.getClass();
Class<?> c2 = o2.getClass();
if (c1.equals(c2)) {
return 0;
}
if (c1.isAssignableFrom(c2)) {
return -1;
} else {
if (!c2.isAssignableFrom(c2)) {
throw new IllegalArgumentException("The classes share no relation");
}
return 1;
}
}
public boolean isComparable(final Class<?> c1, final Class<?> c2) {
return (c1.isAssignableFrom(c2) || c2.isAssignableFrom(c1));
}
}