技术问答-16

HashMap 续集

https://blog.csdn.net/harvic880925/article/details/50085595 可参考
comparableClassFor:

  /**
     * Returns x's Class if it is of the form "class C implements
     * Comparable<C>", else null.
     * 如果继承Comparable 就返回他的class 如果不是就返回null
     * 这个方法在putTreeVal的时候会用到 会把返回值传递给find方法 进行查询
     *
     */static Class<?> comparableClassFor(Object x) {//x 是不是Comparable子类 if (x instanceof Comparable) {//变量申明Class<?> c; Type[] ts, as; Type t; ParameterizedType p;//如果key是String类型 if ((c = x.getClass()) == String.class) // bypass checksreturn c;//获取普通类所继承的接口使用的是Class.getInterfaces()函数 // 获取泛型接口的对象 使用 getGenericInterfacesif ((ts = c.getGenericInterfaces()) != null) {for (int i = 0; i < ts.length; ++i) { 
                	//ParameterizedType代表一种泛型类型   public class Point<T> {} Point类就是泛型类型//public class PointImpl extends Point<Integer> { }//Class<?> clazz = PointImpl.class; Type type = clazz.getGenericSuperclass();//获得PointImpl.class的父类,而它的父类是Point,这明显是一个泛型类型,所以它对应的类型就是ParameterizedType;	
                	//getRawType获取泛型表达式类或者接口的Class对象  上边的例子泛型是Point 所以返回Point.Class//这里是判断返回的是不是Comparable.class	
                	//getActualTypeArguments 返回当前泛型表达式中,用来填充泛型变量的真正值的列表   上边例子就是Integer if (((t = ts[i]) instanceof ParameterizedType) &&((p = (ParameterizedType)t).getRawType() == Comparable.class) &&(as = p.getActualTypeArguments()) != null &&as.length == 1 && as[0] == c) // type arg is creturn c;}}}return null;}
上一篇:PriorityBlockingQueue


下一篇:Java容器类面试题总结