JDK8中HashMap的comparableClassFor方法
程序员文章站
2022-06-04 19:49:25
...
- JDK8中HashMap的comparableClassFor方法作用:Returns x’s Class if it is of the form “class C implements Comparable”, else null.
翻译过来,大概的意思是:如果类C实现了Comparable ,即返回对象x的类C的Class。
例如:String实现了Comparable< String >,那么则返回String.class。若没有,则返回null。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
以下是comparableClassFor方法的源码:
/**
* Returns x's Class if it is of the form "class C implements
* Comparable<C>", else null.
* 如果类C实现了Comparable<C> ,即返回对象x的类C的Class。
* 否则返回null
*/
static Class<?> comparableClassFor(Object x) {
if (x instanceof Comparable) {
Class<?> c;
Type[] ts, as;
Type t;
//参数化类型,是Type的子接口
ParameterizedType p;
//如果x是字符串对象,则返回x.getclass,因为String已经实现了Comparable<String>
//c = x.getclass
if ((c = x.getClass()) == String.class) // bypass checks
return c;
//如果存在实现的接口,将接口的数组传给ts(包括参数化类型)
//getGenericInterfaces getInterfaces的区别:一个返回Type[],一个返回Class[](已经被类型擦除了,so)
if ((ts = c.getGenericInterfaces()) != null) {
/**
* Class类中的getGenericInterfaces()方法的解释:Returns the Types representing the interfaces
* directly implemented by the class or interface represented bythis object.
* 返回表示直接由该对象表示的类或接口实现的接口的类型。
*/
//遍历
for (int i = 0; i < ts.length; ++i) {
//我们要判定的是,x是否实现了Comparable<C>,所以,父接口若为Comparable<C>,则
//它应该是一个参数化类型,
//声明此类的接口为Comparable
//实际类型参数的数组不为空
if (((t = ts[i]) instanceof ParameterizedType) && //它应该是一个参数化类型
((p = (ParameterizedType)t).getRawType() == //声明此类的接口为Comparable
Comparable.class) &&
(as = p.getActualTypeArguments()) != null && //实际类型参数的数组不为空
as.length == 1 && as[0] == c) //并且长度为1,且为C
return c;
}
}
}
return null; //没找到即返回空
}
- 其中ParameterizedType是参数化类型,可以参见 java中的Type