我有两个Class1和Class2, Class1 obj; Class2 obj1; 我如何比较obj是Class2的实例? 我无法对这些类使用instanceOf运算符,它给出了编译错误“无法比较不兼容的类型”
答案 0 :(得分:1)
如果它在编译时失败,您可以确定它在运行时总是会失败。编译器不允许在两种类型上使用instanceof
,其中第一种不能是第二种类型的实例。 e.g:
Integer i = 5;
if (i instanceof String) {
System.out.println("Never happen");
}
编译器肯定知道Integer永远不能是String,因为它们不在同一个继承层次结构中。因此它甚至不会让你写它。无论如何你都想写它,那么你的设计和/或你的逻辑就会出现问题。
话虽这么说,Class.isAssignableFrom()是检查只能在运行时失败的继承层次结构的另一种方法:
Integer i = 5;
if (String.class.isAssignableFrom(i.getClass())) {
System.out.println("Never happen");
}
需要重申的是,虽然上述内容将成功编译,但条件仍然永远不会成立。只有当它们处于相同的继承层次结构中时才比较它们才有意义。例如,这是一个合理的比较:
Number n = 1;
if (n instanceof Integer) {
System.out.println("I'm an int!");
} else if (n instanceof Long) {
System.out.println("I'm a long!");
}
但是,如果您想要编写这样的代码,那么它几乎总是意味着您已经破坏了代码中的多态性,因为这正是它应该处理的那种事情。
答案 1 :(得分:0)
这不会编译:
String s = "42";
if (s instanceof Integer) {
....
}
但这会:
String s = "42";
Object o = s;
if (o instanceof Integer) {
....
}
要理解的是,在进行静态类型检查时,编译器正在使用声明的表达式类型。在第一种情况下,s
的类型为String
,而String
不能为Integer
。在第二种情况下,o
的类型为Object
,可分配给Object
的内容可以为Integer
。 (当然,第二个示例中的测试将始终评估为false
...因为o
引用的实际实例不是Integer
或子类型的实例。)< / p>
答案 2 :(得分:0)
很抱歉,但如果我没有错,你拼写错误并写错了字。
它的instanceof,NOT instanceOf