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 :(得分:4)
r1
和r2
可能包含任何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运算符来检查某些类的类型。