是否可以在java中比较两个不同的类?

时间:2012-05-26 16:12:26

标签: java

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

3 个答案:

答案 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