繁体   English   中英

==运算符的编译错误

[英]Compilation error with == operator

我已将错误隔离到该行: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

我同意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>的引用Class<? extends String> Class<? extends String> ,而OreoJar实例将返回对Class<? extends OreoJar>引用Class<? extends OreoJar> Class<? extends OreoJar>

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


您说的话题有点偏离,但我认为值得一提:

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

我认为最好有更清晰的理解。 它不会“创建”两个Class 对象 getClass()将返回您对Class对象的引用 而且,它总是可以指向一个对象引用 ,不反对这一点反对 (这听起来不可思议太)

我认为它不能编译的原因是由于Class具有泛型组件。 尝试使用momo.getClass().equals(jojo.getClass())并且您还可以尝试比较类的规范名称,以获得类似的效果: momo.getClass().getCanonicalName().equals(jojo.getClass().getCanonicalName())

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM