Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > i.equals(d)


Автор: Entry_N3 3.3.2007, 15:33
В одном из источников есть следующий вопрос-ответ:

"Given:
Integer i = new Integer (42);
Long l = new Long (42);
Double d = new Double (42.0);

Which two expressions evaluate to True? (Choose Two)
A. (i ==l)
B. (i == d)
C. (d == l)
D. (i.equals(d))
E. (d.equals(i))
F. (i.equals(42))
Answer: D, E"

В классе-оболочки Integer есть 
    public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
   return false;

Ведь ссылка obj в данном случае указывает на объект типа Double, и, следовательно, объект, на который указывает obj, не является экземпляром класса Integer. Т.е. в данном случае (obj instanceof Integer) равно false. Т.е. вариант D не работает.

Я проделываю, например D вариант, и у меня false выдается. В чем дело? Правильно ли я рассуждаю?

Автор: hamsterKSU 3.3.2007, 16:30
Цитата

В Java для проверки типа объекта есть операция instanceof . Она часто применяется при понижающем (downcasting) преобразовании. Эта операция проверяет, имеет ли ее левый операнд класс, заданный правым операндом.

http://www.javable.com/tutorials/fesunov/lesson8/

В случае D у тебя класс Double нелзя сравнить с Integer т.к. они разного типа.

Добавлено @ 16:32 
попробуй сделать 
Код
i = (Integer)d;
 компилятор заматерится

Добавлено @ 16:33 
cannot cast from Double to Integer

Автор: Entry_N3 3.3.2007, 17:14
hamsterKSU, я про это же. В ответе D (i.equals(d)) вернет true?

Автор: nornad 4.3.2007, 00:27
Цитата(Entry_N3 @  3.3.2007,  20:14 Найти цитируемый пост)
В ответе D (i.equals(d)) вернет true

Почему должно возвращать true? true из equals возвращается тогда, когда объекты эквивалентны. Странно ты рассуждаешь.
Если всё ещё не дошло, давай рассмотрим приведённый интовый equals:
Код

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
   return false;
}
  • Код

    if (obj instanceof Integer)

    Так как obj пришёл Double, то условие неверно и внутрь условного блока мы не заходим.
  • Код

    return false;

    Как-то не очень похоже на true, верно?  smile

Автор: LSD 4.3.2007, 12:27
В чем проблема?
Берете компилятор и проверяете. Первые три варианта вообще не скомпилируются, а результат остальных можно посмотреть.

Автор: Entry_N3 4.3.2007, 17:39
LSD, я смотрел, у меня false... а вот в источнике, написано, что true! Это меня и смутило.

Автор: LSD 4.3.2007, 23:22
В данном случае компилятор истина в последней инстанции, если он говорит, что это будет true, то значит так оно и есть.
А автор книги или банально ошибся, или имел в виду что-то совсем другое, но не удосужился это объяснить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)