Есть ли способ, кроме оператора instanceof для сравнения типов объектов в Java? - PullRequest
5 голосов
/ 18 декабря 2008

Я помню, как читал в какой-то книге по Java о любом операторе, кроме 'instanceof', для сравнения иерархии типов между двумя объектами.

instanceof является наиболее используемым и распространенным. Я не могу точно вспомнить, есть ли другой способ сделать это или нет.

Ответы [ 4 ]

6 голосов
/ 18 декабря 2008

Да, есть. Не оператор, а метод класса Class.

Вот оно: isIntance (Объект o)

Цитата из документа:

... Этот метод является динамическим эквивалентом оператора instanceof языка Java

public class Some {
    public static void main( String [] args ) {
        if ( Some.class.isInstance( new SubClass() ) ) {
            System.out.println( "ieap" );
        } else { 
            System.out.println( "noup" );
        }
    }
}
class SubClass extends Some{}
6 голосов
/ 18 декабря 2008

Вы также можете, в основном для отражения, использовать Class.isInstance.

Class<?> stringClass = Class.forName("java.lang.String");
assert stringClass.isInstance("Some string");

Очевидно, что если тип класса известен во время компиляции, тогда instanceof по-прежнему лучший вариант.

3 голосов
/ 18 декабря 2008

Операция instanceof является наилучшим вариантом по двум причинам: 1) Он обрабатывает подтипы, поэтому если у вас есть экземпляр подкласса / подтипа, вы все равно получите true. 2) Он обрабатывает нуль, поэтому ноль instanceof Class будет возвращать false

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

Если вы работаете с объектами, которые представляют классы, вы можете использовать операции отражения, поскольку instanceof будет ссылаться на их собственный класс Class, а не на класс, который они представляют.

1 голос
/ 18 декабря 2008
if ( someClass.isAssignableFrom( obj.getClass() ) )

эквивалентно

if ( obj instanceof Foo )

Используйте instanceof, если проверяемый класс известен во время компиляции, используйте isAssignableFrom, если он известен только во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...