2016-08-20 22 views
-1

我讀到Java中的泛型是使用類型擦除來實現的。 我想測試,看看我完全理解這個概念,但我感到震驚和困惑地發現,這段代碼非常完美:爲什麼在通用方法中使用反射時會起作用?

public class Test{ 
    public static void main(String []args){ 
     canAssign3(3,3.2); 
    } 

    static<T1,T2> boolean canAssign3(T1 from, T2 to){ 
     Class<?> c1 = from.getClass(); 
     Class<?> c2 = to.getClass(); 
     System.out.println(c1.getName()); 
     System.out.println(c2.getName()); 
     System.out.println(c2.isAssignableFrom(c1)); 
     return (c2.isAssignableFrom(c1)); 
    } 
} 

輸出:

java.lang.Integer 
java.lang.Double 
false 

我預計c1的班級和c2的班級爲Object,還有c2.isAssignableFrom(c1)true。 我在這裏錯過了什麼?

+0

類型擦除發生在編譯時。 –

回答

5

通用與否,每個對象都有一個類,它是你所調用的那個類的方法。

如果兩個參數的類型都是Object,則此方法的工作效果會相同。事實上,使它們通用不會增加任何價值,因爲你不使用泛型類型。

+0

謝謝!那麼是否有反射WONT由於使用泛型而工作的情況? –

+0

反思早於泛型。反射不使用泛型,不受影響。 – Bohemian

相關問題