Java 泛型类引用的比较 公共类主{ 静态类A{}; 静态类B{}; 公共静态void main(字符串[]args){ 类r1=新的A().getClass(); 类r2=新的B().getClass(); 布尔值a=(r1==r2);//这是正常的 布尔b=(新的A().getClass()==新的b().getClass());//编译错误 } }

Java 泛型类引用的比较 公共类主{ 静态类A{}; 静态类B{}; 公共静态void main(字符串[]args){ 类r1=新的A().getClass(); 类r2=新的B().getClass(); 布尔值a=(r1==r2);//这是正常的 布尔b=(新的A().getClass()==新的b().getClass());//编译错误 } },java,generics,Java,Generics,r1表示类型类,r2表示类型类。我想比较它们是不正确的。但编译器不会在字符串“布尔a=(r1==r2);”中产生错误,为什么?它在泛型类型安全方面是如何工作的 例如,您无法比较“boolean c=(new ArrayList()==new ArrayList());”,编译器会说“不可比较的类型”。r1和r2可能包含任何类实例的引用,因此它们可能包含对同一类的引用。因此,编译器允许进行这种比较 当您在-new A().getClass()==new B().getClass()中比较绑定类实例

r1表示类型
,r2表示类型
。我想比较它们是不正确的。但编译器不会在字符串“
布尔a=(r1==r2);
”中产生错误,为什么?它在泛型类型安全方面是如何工作的


例如,您无法比较“
boolean c=(new ArrayList()==new ArrayList());
”,编译器会说“不可比较的类型”。

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


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

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

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

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

从:

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


在第一种情况下,类强制转换为强制转换,但在第二种情况下,B既不强制转换为A,A也不强制转换为B。

如果您希望了解某个类是否属于某种类型,则需要执行以下操作:

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
    }
}

这就是在Java中使用instanceof操作符检查类是否属于特定类型的方法。

如果要检查对象的类,请使用
instanceof
。是否要包括
.getClass()
在最后一段的比较中?但是您不能以OP打算使用
instanceof
来比较实例(对象)的方式来比较它们。您可以执行
(r1==r2)
,因为它们是
类的引用,而编译器无法确定哪些类是。谢谢!您可以参考java标准或其他资源来深入阅读赋值和比较通配符泛型吗?
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);
        }
    }
}