Когда "obj instanceof Object" ложно в Java? - PullRequest
4 голосов
/ 27 августа 2009

Рассмотрим

 Object obj = ....;
 System.out.println(obj instanceof Object);

Что должно быть obj, чтобы ответить false (Любой другой вариант, кроме null)

Ответы [ 10 ]

39 голосов
/ 27 августа 2009

Это вопрос с подвохом?

Object obj = new Object() {{ System.out.println(false); System.exit(0); }};
System.out.println(obj instanceof Object);
11 голосов
/ 27 августа 2009

Это напечатает false:

public final class Foo {
    static private final class Object {
    }

    static public void main(String[] args)
    {
        java.lang.Object o = new java.lang.Object();
        System.out.println(o instanceof Object);
    }
}

Это не вполне , что вы просили, но лучшее, что я мог придумать ...

9 голосов
/ 27 августа 2009

Это никогда вернет false, если obj не равно нулю

6 голосов
/ 27 августа 2009

Все расширяет объект, так что вы всегда получите истину здесь (если obj не равен нулю).

1 голос
/ 27 августа 2009

Каждый объект происходит от «Объекта». Ваше утверждение будет всегда верным.

0 голосов
/ 05 августа 2015

Это также может быть экземпляр примитивного объекта, такого как int, double, boolean и т. Д. Если это так, он, вероятно, также вернет false

0 голосов
/ 30 ноября 2011

Старый, старый вопрос, но:

  • если obj равно нулю
  • если вы используете jview в конце 90-х и пробовали Variant (не вспоминайте пакет наизусть).
0 голосов
/ 27 августа 2009

Очевидно, что если Object относится к java.lang.Object (как определено загрузчиком загрузчиков классов), это невозможно, поскольку каждый класс в процессе должен происходить от java.lang.Object

Однако вы можете определить что-то еще, называемое Object во внутренней области видимости, скрывая java.lang.Object.

Вот пример, где имя Object относится к java.lang.Object в начале метода, а позже к локальному классу:

public static void main(String[] args) {
    Object value = "42"; class Object {}
    System.out.println(value instanceof Object);
}

Это небольшой обман, потому что объявление value - это не одно утверждение, а утверждение, за которым следует определение локального класса.

Я тестировал это в Eclipse 3.5.0, но я не удивлюсь, если другие компиляторы будут вести себя по-другому с таким патологическим примером, как этот.

0 голосов
/ 27 августа 2009

Единственный способ сделать его ложным - не дать ему объект, дать ему нулевую ссылку

Обсуждается здесь

0 голосов
/ 27 августа 2009

Нет AFAIK. Вы получили это как вопрос для интервью?

По определению он должен возвращать true, если вы можете преобразовать переменную в Object, и все ненулевые значения должны быть конвертируемыми. Возможно, с дженериками есть какая-то хитрость, но я в этом сомневаюсь.

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