2014-03-25 30 views
2
public <T, V> void F1(T p1, V p2) { 
    //Method 1 
    if (p1.getClass() == p2.getClass()) { 
    } 

    //Method 2 
    if (p1.getClass().equals(p2.getClass())) { 
    } 

    //Method 3 
    if (p1.getClass().getName().equals(p2.getClass().getName())) { 
    } 
} 

我要比較的參數的類相比,什麼是差異性階級類型Java中

哪種方法更安全,還是有3個使用任何點點區別?

+1

我無法測試它正確n但似乎第三種方法有缺陷:兩個類可以在不同的名稱空間中具有相同的名稱。 –

+0

@JeroenVannevel getName()方法是否返回類的完全限定名? –

+0

@RohitJain:[顯然不是](https://ideone.com/gnNcJO) –

回答

1

所有這三種方法都會執行相同的任務。但理想情況下,你應該採取第一種方法。實際上,由於Class不會覆蓋equals()方法,因此無論如何將會調用Object#equals()方法。而且它也是有意義的,對於每個特定的類,每個類加載器只有一個類實例。因此,使用==進行比較將會非常好。

而且,我認爲,如果p1p2對應於不同的類加載器加載的同一類,那麼前兩個條件將是false,而最後一個將是true

0

這取決於你需要檢查。你三種方法檢查三個不同的東西:

  1. 檢查類的兩個實例相同的實例
  2. 檢查類的兩個實例的實例同一類的
  3. 檢查Class的兩個實例是兩個類的實例,其名稱相同(不一定是相同的類)