2015-02-23 67 views
2
public class Main { 
    static class A {}; 

    static class B {}; 

    public static void main(String[] args) { 
     Class<?> r1 = new A().getClass(); 
     Class<?> r2 = new B().getClass(); 

     boolean a = (r1 == r2); //it is ok 
     boolean b = (new A().getClass() == new B().getClass()); //compilation error 
    } 
} 

r1是對類型Class<A>的引用,並且r2是對類型Class<B>的引用。我想這是不正確的比較它們。但編譯器不會在字符串「boolean a = (r1 == r2);」中產生錯誤爲什麼?它如何在泛型類型安全方面起作用?參考通用類別的比較

例如,您無法比較「boolean c = (new ArrayList<String>() == new ArrayList<Integer>());」,編譯器會說'無法比擬的類型'。

+0

如果你想檢查一個對象的類,使用'instanceof'。 – m0skit0 2015-02-23 14:11:50

+1

你是否在最後一段的比較中加入了'.getClass()'? – arootbeer 2015-02-23 14:12:37

+0

但是你不能用這種方式比較它們,即OP意圖 – 2015-02-23 14:13:02

回答

4

r1r2可能包含任何Class實例的參考,因此它們可能包含對相同Class的引用。因此編譯器允許這種比較。

當您在 - new A().getClass() == new B().getClass()中比較綁定的類實例時 - 編譯器知道它們不是相同的類型,因此不允許它。

+0

謝謝!你可以提供一個Java標準的參考資料,也可以提供其他資源深入閱讀有關賦值和比較通配符泛型的內容嗎? – 2015-02-23 14:37:43

1

首先 - 您不能通過僅使用參考來比較類。如果你想檢查類是相同的類型,你必須在java中使用instanceof運算符。

1

在第一種情況下,您將一個Class的引用與另一個Class的引用進行比較。

在第二種情況下,您將比較對類型A的對象的引用和對不允許的類型B的對象的引用。

The Java Language Specification

它是一個編譯時間錯誤,如果這是不可能通過鑄造轉換 類型任一操作數轉換的 到其他的類型(§5.5)。兩個操作數的運行時間值必須是 不等於。

在第一種情況下,類蒙上投,但在第二種情況下,既不乙強制轉換爲A,也不如果你想找出一個類的一個投射到B

0

某些類型的,你需要做類似如下:

public class Main { 
    static class A {}; 

    static class B {}; 

    public static void main(String[] args) {  
     A objA = new A(); 
     B objB = new B(); 

     if (objA instanceof A) { 
      System.out.println("objA is an instance of A); 
     } 
     if (objB instanceof B) { 
      System.out.println("objB is an instance of B); 
     } 
    } 
} 

這是你如何檢查類是某種類型的在Java中使用instanceof運算符。