对泛型类的引用的比较

时间:2015-02-23 14:06:27

标签: java generics

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>());”,编译器会说“无法比较的类型”。

4 个答案:

答案 0 :(得分:4)

r1r2可能包含任何Class实例的引用,因此它们可能包含对同一Class的引用。因此编译器允许这种比较。

比较 - new A().getClass() == new B().getClass()中的绑定类实例时 - 编译器知道它们的类型不同,因此不允许它。

答案 1 :(得分:1)

首先 - 您不能仅使用引用来比较类。如果要检查类是否相同,则必须在java中使用instanceof运算符。

答案 2 :(得分:1)

在第一种情况下,您将对Class的引用与对另一个Class的引用进行比较。

在第二种情况下,您将对类型A的对象的引用与对不允许的类型B的对象的引用进行比较。

来自The Java Language Specification

  

如果无法转换类型,则为编译时错误   通过转换转换将操作数转换为另一个的类型   (§5.5)。两个操作数的运行时值必然是   不相等的。

在第一种情况下,Class转换为Cast,但在第二种情况下,B转换为A,A转换为B。

答案 3 :(得分: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运算符来检查某些类的类型。