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


Автор: polosatij 15.8.2007, 13:05
встретился недавно со следующей делемой.. как вы думаете, что выдаст данный код?

Код

    public static void main(String[] args) {
        Boolean b = true;
        System.out.println(b ? new Integer(10) : new Float(100)); 
    }


все те, кто подумал, что код данный выдаст 10 не прошли этот тестsmile Вы удивлены?  smile 

правильный результат: 10.0 smile

теперь хотелось бы узнать, почему это так.. посмотрев в байт код.. хм.. и действительно, после того как .... =>  integer будет сконвертирован в float. почему это так?
я бы тоже хотел знать ответ на данный вопрос. сейчас я готовлюсь к сдаче scjp и подобные вопросы меня просто убивают.. посему, никто не мог бы подсказать какой путёвой книги по Java 1.5 Compiler? кинуть линком или путёвой документацией на подобную "идеотскую" тему?  smile 

Автор: Antropoid 15.8.2007, 13:14
Ашо странного? Нет, я ответа не знал, но вроде все логично: рано или поздно JVM начнет сравнивать целое и дробное, для этого приведет целое к дробному, сравнит дробное с дробным и возвратит дробный результат...

Автор: polosatij 15.8.2007, 13:17
Цитата(Antropoid @  15.8.2007,  13:14 Найти цитируемый пост)
Ашо странного? Нет, я ответа не знал, но вроде все логично: рано или поздно JVM начнет сравнивать целое и дробное, для этого приведет целое к дробному, сравнит дробное с дробным и возвратит дробный результат... 


я что-то не очень понимаю, зачем ей сравнивать целое и дробное??.. может ты мне можешь объяснить? smile

Автор: _Michael 15.8.2007, 13:23
polosatij,http://forum.vingrad.ru/forum/topic-24799.html очень много таких различных особенностей и казусов. smile недавно просто переглядал
Цитата

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

Че то я не очень понимаю. Ведь b = true; значить создается new Integer(10) а к new Float(100) даже не доходит. разве не так? smile

Автор: Antropoid 15.8.2007, 13:26
Думаю потому, что ? :  - тернарная операция и ее операнды(до : и после) должны быть одной масти.

Автор: polosatij 15.8.2007, 13:31
Цитата(Antropoid @  15.8.2007,  13:26 Найти цитируемый пост)
Думаю потому, что ? :  - тернарная операция и ее операнды(до : и после) должны быть одной масти. 



если это так.. то почему данный пример:

Код

    public static void main(String[] args) {
        Boolean b = true;
        System.out.println(b ? new Integer(10) : "hi"); 
    }


не конвертирует Integer в String, если посмотреть в байткод? smile значит это правило касается только Number? smile

Автор: _Y_ 15.8.2007, 13:37
Цитата(Antropoid @ 15.8.2007,  13:26)
Думаю потому, что ? :  - тернарная операция и ее операнды(до : и после) должны быть одной масти.

Пожалуй, собака именно здесь. Ведь на печать выводится не 
Код

new Integer(10)
, а результат действия всего оператора. Что-то в духе
Код

obj = b ? new Integer(10) : new Float(100);
System.out.println(obj);

Понятное дело, что правая сторона присвоения возвращает определенный тип.

Но это все, естественно, ИМХО

Автор: polosatij 15.8.2007, 13:41
Цитата(_Y_ @  15.8.2007,  13:37 Найти цитируемый пост)

Понятное дело, что правая сторона присвоения возвращает определенный тип.



вот мне, например, не понятное дело.. посмотрим такой пример:

Код

class Main2 {
    
    public static void main(String[] args) {
        Boolean b = true;
        Object obj =  b ? new Integer(10) : "hi";
        System.out.println(obj); 
    }
}


и что ты хочешь сказать, Integer теперь String?  smile

Добавлено через 2 минуты и 45 секунд
Цитата(_Michael @  15.8.2007,  13:23 Найти цитируемый пост)
polosatij, здесь вот очень много таких различных особенностей и казусов. 



спасибо, но я имел ввиду не примеры.. а примеры с конкретными темами в одной книге  smile 

Автор: AlexeyVorotnikov 15.8.2007, 13:56
Цитата(polosatij @ 15.8.2007,  14:41)
вот мне, например, не понятное дело.. посмотрим такой пример:

Код

class Main2 {
    
    public static void main(String[] args) {
        Boolean b = true;
        Object obj =  b ? new Integer(10) : "hi";
        System.out.println(obj); 
    }
}


и что ты хочешь сказать, Integer теперь String?  smile

Нет, Integer теперь Object.

Автор: polosatij 15.8.2007, 14:00
Цитата(AlexeyVorotnikov @  15.8.2007,  13:56 Найти цитируемый пост)
Нет, Integer теперь Object. 


мы не после объявления говорим, а про конвертацию переменных:

new Integer(10) : "hi";

 smile 

Автор: Antropoid 15.8.2007, 14:09
Цитата(polosatij @  15.8.2007,  13:31 Найти цитируемый пост)
не конвертирует Integer в String, если посмотреть в байткод?  значит это правило касается только Number? 

ИМХО да, это правило только для Number

Автор: polosatij 15.8.2007, 14:11
Цитата(Antropoid @  15.8.2007,  14:09 Найти цитируемый пост)
ИМХО да, это правило только для Number 



ню так, а где почитать про такие правила?  smile 

Автор: AlexeyVorotnikov 15.8.2007, 14:16
Цитата(polosatij @  15.8.2007,  15:11 Найти цитируемый пост)
ню так, а где почитать про такие правила?

Java Language Specification, CHAPTER 15 Expressions, 15.25 Conditional Operator ? :
Цитата

The type of a conditional expression is determined as follows:

    * If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.
    * If one of the second and third operands is of type boolean and the type of the other is of type Boolean, then the type of the conditional expression is boolean.
    * If one of the second and third operands is of the null type and the type of the other is a reference type, then the type of the conditional expression is that reference type.
    * Otherwise, if the second and third operands have types that are convertible (§5.1.8) to numeric types, then there are several cases:
          o If one of the operands is of type byte or Byte and the other is of type short or Short, then the type of the conditional expression is short.
          o If one of the operands is of type T where T is byte, short, or char, and the other operand is a constant expression of type int whose value is representable in type T, then the type of the conditional expression is T.
          o If one of the operands is of type Byte and the other operand is a constant expression of type int whose value is representable in type byte, then the type of the conditional expression is byte.
          o If one of the operands is of type Short and the other operand is a constant expression of type int whose value is representable in type short, then the type of the conditional expression is short.
          o If one of the operands is of type; Character and the other operand is a constant expression of type int whose value is representable in type char, then the type of the conditional expression is char.
          o Otherwise, binary numeric promotion (§5.6.2) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands. Note that binary numeric promotion performs unboxing conversion (§5.1.8) and value set conversion (§5.1.13). 
    * Otherwise, the second and third operands are of types S1 and S2 respectively. Let T1 be the type that results from applying boxing conversion to S1, and let T2 be the type that results from applying boxing conversion to S2. The type of the conditional expression is the result of applying capture conversion (§5.1.10) to lub(T1, T2) (§15.12.2.7). 

Автор: polosatij 15.8.2007, 14:19
AlexeyVorotnikov

ты забыл линк  smile спасиба  smile 

Автор: ekr 15.8.2007, 14:22
Цитата(polosatij @  15.8.2007,  14:11 Найти цитируемый пост)
ню так, а где почитать про такие правила?

Книгу с такими вопросами для подготовки к экзамену sj5cp выложил на своем блоге и на http://courses.4shared.com в разделе books/sj5cp.
Там в архиве есть и программа-тестер.


Автор: AlexeyVorotnikov 15.8.2007, 14:22
Цитата(polosatij @  15.8.2007,  15:19 Найти цитируемый пост)
ты забыл линк  smile спасиба

http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
Рекомендуется к прочтению.

Автор: Bozo 15.8.2007, 22:50
Цитата(polosatij @ 15.8.2007,  13:05)
теперь хотелось бы узнать, почему это так.. посмотрев в байт код.. хм.. и действительно, после того как .... =>  integer будет сконвертирован в float. почему это так?

Наверное потому что javac компилит println в http://java.sun.com/j2se/1.5.0/docs/api/java/io/PrintStream.html#println(float), а потом уже конвертирует Integer в float. А почему она выбирает println(float) при компиляции, а не два варианта (println(int) и println(float))?

Тот же результат, если строку заменить на 
Код

        System.out.println(b ? 10 :  100.0F); 


А что там, в байткоде?

Автор: UnicornMirage 17.8.2007, 13:13
это называется неявным преобразованием расширения типа. В любом выражении результат выражения приводится к самому "широкому" типу по иерархии типов. В данном случае при работе с числовыми типами, приведение расширится до float, а при работе с ссылочными типами, - к Object.

Автор: COVD 17.8.2007, 15:24
Вот наличие таких дурацких вопросов и отталкивает от этих сертификаций. По сути, это ненужное знание. Оно плохо вписывается в логику языка, раз приходится так долго искать обьяснения такому поведению. 

Автор: AlexeyVorotnikov 17.8.2007, 15:53
Если плохо знаешь логику языка, то такие знания и будут плохо вписываться.

Автор: Maksym 17.8.2007, 16:29
COVD
Согласен в том, что большАя часть сертификационных вопросов тестирует не те знания и навыки, которые нужны рынку (работодателю).
А для общего развития, чем не интересная задачка... smile

Автор: SoulKeeper 28.7.2008, 13:32
Такие вещи еше Brainbench любит... А вообще сорри за поднятие трупа, не удержался smile

Т.к. в работе оно встречается раз в пятилетку.

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