源码分析
/**
* Returns x's Class if it is of the form "class C implements
* Comparable<C>", else null.
*
* 如果x在定义时的形式为“Class C implements Comparable<C>”
* 即x实现了Comparable接口
* (八大基本类型的包装类和字符串类都实现了,自定义类型就不一定实现了)
* 则返回x的类型,否则返回null
*/
static Class<?> comparableClassFor(Object x) {
//x实现了comparable接口
if (x instanceof Comparable) {
Class<?> c; Type[] ts, as; Type t; ParameterizedType p;
//如果x的类型是String,返回String.class
if ((c = x.getClass()) == String.class)
return c;
//获取c直接实现的接口(可能是多个),如果接口使用了泛型,必须附带泛型信息
if ((ts = c.getGenericInterfaces()) != null) {
for (int i = 0; i < ts.length; ++i) {
//如果当前接口是泛型接口
//且该泛型接口是Comparabel接口
//且Comparable接口中有泛型参数
//且Comparable接口中的泛型参数只有一个
//且Comparable接口中的泛型参数类型就是c
if (((t = ts[i]) instanceof ParameterizedType) &&
((p = (ParameterizedType)t).getRawType() ==
Comparable.class) &&
(as = p.getActualTypeArguments()) != null &&
as.length == 1 && as[0] == c)
//返回x的类型c
return c;
}
}
/*
* JDK源码中String类实现了Comparable接口,我们以此为例:
*
* public final class String implements
* java.io.Serializable, Comparable<String>, CharSequence
*
* 那么就返回String.class
*/
}
return null;
}