2015-02-23 61 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运算符。