1

我已经将错误隔离到这一行: string.getClass() == jojo.getClass() 这行不应该创建两个 Class 对象,然后检查它们(如在两个引用中)是否指向同一个对象?代码不会运行,而不是返回 false 值。

public class Tester 
{
    public static void main(String[] args) 
    {
        OreoJar jojo = new OreoJar(0);
        OreoJar momo = new OreoJar(1);
        String string = "Hello";

        if (momo.getClass() == jojo.getClass())
        {
            System.out.println("Momo and jojo are of the same class");
        }

        if (string.getClass() == jojo.getClass())
        {
            System.out.println("String and jojo are of the same class");
        }
    }
}

public class OreoJar 
{
    int oreos;

    public OreoJar(int oreos)
    {
        this.oreos = oreos;
    }

    public void count()
    {
        System.out.println(oreos + " oreos in this jar!");
    }
}

这个评论有点隐藏,我认为值得一提,因为它对初学者(比如我自己)最有意义

- 根据 JLS “如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型,则这是编译时错误”,因此可以比较类型 A 和 B 的两个引用,如果且仅如果,A 可以转换为 B,或者 B 可以转换为 A。——Patricia Shanahan

4

3 回答 3

6

我同意 OP 应该引用编译错误。

无论如何,当任何人实际进行编译时,编译错误是非常明显的。

错误是:

Tester.java:15: incomparable types: java.lang.Class<capture#125 of ? extends java.lang.String> and java.lang.Class<capture#29 of ? extends OreoJar>
    if (string.getClass() == jojo.getClass()){
                          ^

原因似乎很明显。

来自 Object.getClass() 的 Javadoc:

The java.lang.Class object that represents the runtime class of the
object. The result is of type Class<? extends X> where X is the
erasure of the static type of the expression on which getClass is
called.

这意味着,一个 String 实例将返回对 的引用Class<? extends String>,而 OreoJar 实例将返回对 的引用Class<? extends OreoJar>

这两种类型根本不兼容,因为编译器知道任何扩展 String 的类型都不可能是扩展 OreoJar 的类型。所以比较会导致编译错误。


有点跑题了,但我认为值得一提,你说:

这行不应该创建两个 Class 对象然后检查它们是否指向同一个对象

我认为最好有更清晰的认识。它不会“创建”两个 Class对象。getClass() 将返回对 Class 对象的引用。而且,它始终是可以指向对象的引用,而不是指向对象的对象(听起来也很奇怪)

于 2013-01-07T02:00:44.613 回答
3

我认为它无法编译的原因是因为 Class 具有通用组件。尝试使用momo.getClass().equals(jojo.getClass()) And 您也可以尝试比较类的规范名称以获得类似的效果:momo.getClass().getCanonicalName().equals(jojo.getClass().getCanonicalName())

于 2013-01-07T01:50:50.440 回答
-1

getClass()返回一个类的实例。getClass().getName()返回一个字符串。该String.equals(otherString)方法是比较字符串是否相等的正确方法。

于 2013-01-07T01:42:11.433 回答