почему instanceof не работает так, как звучит? - PullRequest
2 голосов
/ 29 ноября 2011

В Java оператор instanceof вернет false только при сравнении null. Если вы тестируете ссылочную переменную, которая не имеет требуемого типа, программа не сможет скомпилироваться. Этот оператор эффективно только проверяет, является ли ссылка null или нет? Или есть другое применение, о котором я не думаю?

Если нет, почему бы не назвать это isNull или чем-то более наглядным?

Ответы [ 5 ]

5 голосов
/ 29 ноября 2011

Я не уверен, как вы пришли к своему выводу, но операция instanceof приведет к false, когда тип времени выполнения первого операнда не совпадает с типом, указанным вторым операндом.

Например,

Object t1 = "Hello, World!";
System.out.println(t1 instanceof Number);

& hellip; печатает "false", потому что t1 является String, а не Number или одним из его подклассов.

Не могли бы вы привести пример операции instanceof, которую не удалось скомпилировать? Скорее всего, это связано с синтаксической ошибкой.

4 голосов
/ 29 ноября 2011

Не компилируется, если сравнение никогда не может быть верным. Например:

"string" instanceof Number

Это не скомпилируется, потому что компилятор знает, что строка никогда не может быть числом. Оператор делает именно то, что и ожидалось: он проверяет, является ли операнд экземпляром указанного типа.

Возвращение false при тестировании нулевой ссылки должно сделать код более простым и более читабельным. Это мешает вам сделать это:

if (obj != null && obj instanceof Number) {
    ...
}

Прочтите это, чтобы узнать об операторе: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2

1 голос
/ 29 ноября 2011

instanceof возвращает true, если вы используете его снова, экземпляр класса справа или любой производный от него.В противном случае он вернет false.

class A { /*...*/ }
class B extends A { /*...*/ }

A objA = new A();
B objB = new B();

boolean test = objA instanceof A;   // test is true
test = objA instanceof B;   // test is false
test = objB instanceof A;   // test is true
test = objB instanceof B;   // test is true

Приведенный выше код не вызовет никаких исключений.Следующее будет делать, однако:

objB = (B) objA;

Надеюсь, это поможет.

1 голос
/ 29 ноября 2011

Это полезно, когда у вас есть ссылка на тип суперкласса, и вы хотите проверить, является ли объект экземпляром некоторого подкласса:

например,

public class Sup { }

public class Sub1 extends Sup { }

public class Sub2 extends Sup { }

public void someMethod(Sup sup) {
    if(sup instanceof Sub1) {
        //....
    }
}
0 голосов
/ 29 ноября 2011
if(MyObj instanceof SomeClass)
  • Если объект левой стороны равен нулю = вернуть false
  • , если левая сторона не является экземпляром класса правой стороны, вернуть false
  • , если левая сторона является экземпляром, если справаside, затем возвращают true

Обратите внимание, что в большинстве случаев можно избежать экземпляра использования с полиморфизмом.

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