Ответ 1
java.lang.Class
не отменяет метод equals
из java.lang.Object
, который реализован следующим образом:
public boolean equals(Object obj) {
return (this == obj);
}
Итак, a == b
совпадает с a.equals(b)
(кроме if a
null).
Мне нужно сравнить объект класса со списком предварительно определенных классов. Можно ли использовать == или использовать equals()?
if (klass == KlassA.class) {
} else if (klass == KlassB.class) {
} else if (klass == KlassC.class) {
} else {
}
Примечание: Я не могу использовать instanceof
, у меня нет объекта, у меня просто есть объект .class
. Я (неправильно) использую его как перечисление в этой ситуации!
java.lang.Class
не отменяет метод equals
из java.lang.Object
, который реализован следующим образом:
public boolean equals(Object obj) {
return (this == obj);
}
Итак, a == b
совпадает с a.equals(b)
(кроме if a
null).
Для большинства приложений Java это правильно. Однако сравнение классов Java с использованием оператора == безопасно, только если оба класса загружаются одним и тем же загрузчиком классов.
Я не уверен, что это сработает для вашей конкретной ситуации, но вы можете попробовать Class.isAssignableFrom(класс).
KlassA.class.isAssignableFrom(klass)
Это, вероятно, безопасно.
Если объект не переопределяет метод Equals
, он проведет сравнение между ссылками. И если две переменные указывают на один и тот же объект, их ссылки совпадают.
Я предпочитаю использовать == для сравнения между объектами класса и константами перечисления, потому что это приводит к ошибкам времени компиляции в случае несовместимых типов.
Например:
Class<?> cls1 = Void.class;
String cls2 = "java.lang.String";
if (cls1 == cls2) doSomething(); // Won't compile
if (cls1.equals(cls2)) doSomething(); // Will compile
Как упоминалось в предыдущих ответах, для сравнения объектов класса (или объектов java.lang.Class) мы должны использовать оператор ==. Однако это может быть немного запутанным, потому что всегда результат сравнения между объектами через оператор == не может приводить к правильным результатам (обычно мы используем метод equal()). Например, результат этого выражения неверен:
new String("book") == new String("book")//false
Причина в том, что
Виртуальная машина управляет уникальным объектом класса для каждого типа. Поэтому вы можете использовать оператор == для сравнения java.lang.Class объекты. Из Ядро для Java - Страница 153
Таким образом:
new String("book").getClass() == new String("book").getClass()//true
или
Class.forName("java.lang.String") == Class.forName("java.lang.String")//true
приведет к истинному.