Сравнить объекты класса

Мне нужно сравнить объект класса со списком предварительно определенных классов. Можно ли использовать == или использовать equals()?

if        (klass == KlassA.class) {
} else if (klass == KlassB.class) {
} else if (klass == KlassC.class) {
} else {
}

Примечание: Я не могу использовать instanceof, у меня нет объекта, у меня просто есть объект .class. Я (неправильно) использую его как перечисление в этой ситуации!

Ответы

Ответ 1

java.lang.Class не отменяет метод equals из java.lang.Object, который реализован следующим образом:

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

Итак, a == b совпадает с a.equals(b) (кроме if a null).

Ответ 2

Для большинства приложений Java это правильно. Однако сравнение классов Java с использованием оператора == безопасно, только если оба класса загружаются одним и тем же загрузчиком классов.

Ответ 3

Я не уверен, что это сработает для вашей конкретной ситуации, но вы можете попробовать Class.isAssignableFrom(класс).

KlassA.class.isAssignableFrom(klass)

Ответ 4

Это, вероятно, безопасно.

Если объект не переопределяет метод Equals, он проведет сравнение между ссылками. И если две переменные указывают на один и тот же объект, их ссылки совпадают.

Ответ 5

Я предпочитаю использовать == для сравнения между объектами класса и константами перечисления, потому что это приводит к ошибкам времени компиляции в случае несовместимых типов.

Например:

Class<?> cls1 = Void.class;
String cls2 = "java.lang.String";

if (cls1 == cls2) doSomething();        // Won't compile

if (cls1.equals(cls2)) doSomething();   // Will compile

Ответ 6

Как упоминалось в предыдущих ответах, для сравнения объектов класса (или объектов 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

приведет к истинному.