在Java中,我是否可以安全地假设`==`将用于比较`Class< 类型的对象?>`?[duplicate]

yx2lnoni  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(105)

此问题已在此处有答案

Java equals for a Class. Is == same as .equals(3个答案)
3天前关闭。
我理解,如果一个对象没有显式重写equals,它会使用基Object.equals(),这实际上与==操作符没有什么不同。
Class<?>没有显式地覆盖equals,所以我的下一个问题是,我能保证两个相同的Class<T>==与equals进行比较吗?或者,我声明的Class<T>的一个示例是否与具有相同类型参数T的另一个示例是不同的对象引用?
换句话说,在符合规范的Java环境中,下面的代码是否有可能输出"true"以外的任何内容?

public class ClassA
{
    private static final String STRING = "Hello World";
    public final Class<?> theClass = STRING.getClass();
    public final Class<?> theClass2 = "Goodbye World".getClass();
    public static void main(String[] args)
    {
        ClassA a = new ClassA();
        System.out.println(Boolean.toString(a.theClass == a.theClass2));
    }
}
km0tfn4u

km0tfn4u1#

相当安全。
从Java虚拟机规范§ 5.3:
一个行为良好的类加载器应该维护三个属性:
给定相同的名称,一个好的类装入器应该总是返回相同的Class对象。
...
这意味着,虽然不能保证,但您可以假设正在使用的类加载器遵守该语句。
这当然假设每个类都由一个类加载器加载。JVM使用的模型是类加载器可以将类的加载 * 委托 * 给另一个类加载器。因此,虽然我不能确切地发现是否禁止不同的类加载器加载同一个类,但我无法想象,在正常情况下,==操作符左侧的类示例与右侧的示例有何不同。

相关问题