欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
相关标签: java hashmap