Java дорівнює для класу. Це == те саме, що .equals


79

Можемо чи ми зробити ==на Classзмінну замість equalsі очікувати того ж результату?

Наприклад:

Class clazz = xyz;

Випадок A:

if(clazz == Date.class) {
// do something
}

Випадок B:

if(Date.class.equals(clazz)) {
// do something
}

Чи випадки A та B є функціонально однаковими?


2
Можливий дублікат - stackoverflow.com/questions/971954/…
mre

13
@mre, ну моє запитання стосується конкретно екземплярів типу Class. Гарантовано, що завантажувач класів повертає той самий екземпляр Class для даного типу даних чи ні.
Рамеш,

На основі деяких швидких експериментів, схоже, так. Але я не знаю, чи це гарантовано.
Clockwork-Muse

Відповіді:


93

Клас є остаточним, тому його дорівнює () неможливо замінити. Його метод equals () успадковується від Object, який читає

public boolean equals(Object obj) {
    return (this == obj);
}

Так що так, вони однакові для класу або будь-якого типу, який не замінює equals(Object)

Щоб відповісти на ваше друге запитання, кожен ClassLoader може завантажити клас лише один раз і завжди дасть вам один і той же клас для даного повного імені.


8
чи можливо, що два навантажувачі різних класів виробляли різні класи, і їм траплялося?
voipp

3
@voipp не виключено, що ви можете мати два екземпляри "того самого" класу, отримані від двох завантажувачів різних класів, але така ситуація не виникала б за звичайних обставин
kbolino

1
І навіть якщо така ситуація справді настала, два класи все одно вважатимуться відмінними за методом рівних. Вам потрібно було б порівняти класи за іменами, якщо ви хотіли б знати, чи є вони "однаковими", але вони все одно можуть бути двома різними версіями одного класу або навіть випадковим зіткненням, створеним двома різними розробниками. З точки зору jvm, звичайно, вони не взаємозамінні, навіть якщо вони справді однакові.
Jeremy Huiskamp

3
Це я сказав, чи не так? Я посилався на коментар @ kbolino про отримання двох екземплярів "того самого" класу від двох завантажувачів різних класів.
Jeremy Huiskamp

2
@kbolino Одного разу приклад того, коли кілька екземплярів "одного" класу, отриманих від завантажувачів різних класів, є дещо частішим у світі OSGI та ESB (наприклад, ServiceMix).
Пітер Кірбі,

6

Так.

Погляньте на опис класу Class і зауважте, що він успадковується equalsвід Object, для якого метод читає:

"Метод equals для класу Object реалізує найбільш виразне можливе відношення еквівалентності на об'єктах; тобто для будь-яких ненульових посилальних значень x і y цей метод повертає true тоді і тільки тоді, коли x і y посилаються на один і той же об'єкт (x = = y має значення true). "


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.