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