HashMap.comparableClassFor(Object x) 的函式解讀 原文敘述
Returns x’s Class if it is of the form “class C implements Comparable”, else null.
我的翻譯 當x的類別為Comparable的實作時,返回x的類別;否則返回 null。
藉由這個函式實例的解讀,可以了解一下類別、泛型的相關概念。 Source Code static Class<?> comparableClassFor(Object x) { if (x instanceof Comparable) { Class<?> c; Type[] ts, as; ParameterizedType p; if ((c = x.getClass()) == String.class) // bypass checks return c; if ((ts = c.getGenericInterfaces()) != null) { for (Type t : ts) { if ((t instanceof ParameterizedType) && ((p = (ParameterizedType) t).getRawType() == Comparable.class) && (as = p.getActualTypeArguments()) != null && as.length == 1 && as[0] == c) // type arg is c return c; } } } return null; } instanceof insanceof 可理解成某類別的實作,無論是執行期時的類別,或是父類別,或是它實現的介面,或父類別實現的介面…,總之只要在繼承鏈上有這個類別就可以了。 getClass() 與instanceof相對應的是getClass()函式,無論該物件如果轉型,getClass()都會返回它執行時期的類別,可以簡單理解成實際類別,換言之也就是我們 new 出來物件時使用的類別。 有一種例外情形是匿名物件,當匿名物件調用getClass()時,返回的是依賴它的物件在執行期的類別,並以1,2,3…的index區分。 getGenericInterfaces() getGenericInterfaces()方法返回的是該物件在執行期時直接實作的介面。必然是該類別自己實作的介面,繼承的則不可。 getGenericSuperclass()和getSuperclass() 這兩個函式雖然沒有出現在 comparableClassFor(Object x)中,但也順帶一提。
...