0

我有两个类 Class1 和 Class2,Class1 obj;类 2 obj1; 如何比较 obj 是 Class2 的实例?我无法对这些类使用 instanceOf 运算符,它给出编译错误“无法比较不兼容的类型”

4

3 回答 3

1

如果它在编译时失败,您可以确定它在运行时总是会失败。编译器不允许您使用instanceof两种类型,其中第一种类型不能是第二种类型的实例。例如:

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!");
}

但是,如果您想编写这样的代码,那几乎总是意味着您已经破坏了代码中的多态性,因为这正是它应该处理的事情。

于 2012-05-26T16:15:01.890 回答
0

这不会编译:

String s = "42";
if (s instanceof Integer) {
    ....
}

但这将:

String s = "42";
Object o = s;
if (o instanceof Integer) {
    ....
}

要理解的是编译器在进行静态类型检查时使用了表达式的声明类型。在第一种情况下,shas typeString和 aString永远不可能是 a Integer。在第二种情况下,o具有类型Object和可分配给的东西Object 可能Integer. (当然,第二个示例中的测试将始终评估为false... 因为o引用的实际实例不是实例Integer或子类型。)

于 2012-05-26T16:26:21.823 回答
0

对不起,但如果我没记错的话,你拼写和写错了这个词..

它的 instanceof ,而不是 instanceOf

于 2012-05-26T17:35:37.267 回答