JavaRush /Курсы /Java Multithreading /Задачи на автобоксинг и числа

Задачи на автобоксинг и числа

Java Multithreading
9 уровень , 5 лекция
Открыта
Задачи на автобоксинг и числа - 1

— Привет, Амиго!

9
Задача
Java Multithreading, 9 уровень, 5 лекция
Недоступна
И еще раз рефакторинг
И еще раз рефакторинг
9
Задача
Java Multithreading, 9 уровень, 5 лекция
Недоступна
Особенности автобоксинга
Особенности автобоксинга
Комментарии (33)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Denis Odesskiy Уровень 47
15 июня 2024
Просто для спортивного интереса проверил в C# тернарный оператор поведет себя также и приведет все к одному значению, решение то же что и в java. А вот в пайтоне тернарник поведет себя иначе (т.к. пайтон динамический язык и будет так:

class Solution:
    def __init__(self):
        self.array = [1, 2, 3, 4]

    def get_value_by_index(self, index):
        return self.array[index] if 0 <= index < len(self.array) else -1.0

# Тест.
solution = Solution()
value1 = solution.get_value_by_index(5)  # -1.0, тип float ожидается
value2 = solution.get_value_by_index(2)  # 3, тип int ожидается

print(f"{value1}, {type(value1)}")
print(f"{value2}, {type(value2)}")
Результат:

-1.0, <class 'float'>
3, <class 'int'>
Очень интересная задача, я не знал о такой важной особенности тернарного оператора в Java (и как выясняется не только Java но и др. строготипизированых ЯП). Хотя если поразмыслить логически то это вполне резонно и ясно, что сделано это специально как раз из-за строгой типизации, типобезопасности и единообразия так сказать. П/С: Как тут можно добавлять спойлер?
Рин Уровень 42
28 апреля 2024
Утка-фрондэндер 🤣
Antonina Pitertseva Уровень 2
26 января 2023
Алексей Уровень 35
5 октября 2021
(Number) array[index] : new Double(-1); Почему так проходит? Что происходит ? Как он узнает что я возвращаю в Number Integer?
SERGEY Уровень 31
26 апреля 2022
Приведение типов должно быть, полагаю твой вопрос это спойлер к тому, что автораспоковка относится и к объектам.
Иван Уровень 41
11 августа 2021
задача хорошая. Заставляет задуматься. Получил новые знания. Но при чём тут автобоксинг не совсем ясно.
Фёкла Уровень 35
2 августа 2020
Перетащу сюда ссылку об особенности работы тернарного оператора (для тех, кто хочет понять смысл второй задачи)
1 сентября 2026
На Хабре нет ни одной статьи, пригодной для первоначального изучения темы. Эта статья не исключение: она путанная и многословная. Только уже будучи специалистом, можно их использовать, чтобы закрывать пробелы в знаниях, например. Или для общего развития. Их пишут, по сути, студенты, которые знают тему, а не преподаватели, цель которых правильно преподнести материал. В общем, я не встретил ни одной годной, в качестве учебного материала, статьи на Хабре. PS Тернарный оператор из задачи всегда будет возвращать Double.
Хорс Уровень 41
18 мая 2020
Евгений Уровень 61 Expert
9 мая 2020
Кстати, я тоже прочитал статью на хабре, разъясняющую работу тернарного оператора.😄 Если говорить очень грубо, то суть в том, что тернарный оператор всегда должен возвращать конкретный тип значения, т.к. в отличие от обычного if-else он может использоваться внутри выражений. Поэтому он не будет возвращать Integer или Double, а будет оборачивать оба варианта в Double (потому что он считает этот тип более точным - как-то так).
Kex Уровень 38 Expert
11 июня 2020
Спасибо, теперь понятно!
Andrii Gorshunov Уровень 41 Expert
13 февраля 2019
как в последней заставить вывести Integer без if ? Юзал такой код - не помогло!

return (index >= 0 && index < array.length) ? Integer.valueOf((int) (new Integer(array[index]).intValue())) : Double.valueOf((double) new Double(-1).doubleValue());
Пётр Уровень 41 Expert
22 апреля 2019
В соответствии с описанием работы тернарного оператора, обе части возвращаемого значения должны быть одинакового типа. То есть у нас тут значение Integer неявно кастуется (упаковывается автобоксингом) в Double при возвращении. Надо дописать явно приведение и инта и дубля к (Number).

(Number) array[index] : (Number) new Double(-1);
Но, нам же говорили на прошлой лекции про нечитаемый код, выкидываемый при рефакторинге, потому надо сделать более глубокий рефакторинг вида:

 if (Arrays. asList(array).contains(index)) return array[index]
Artur Уровень 40 Expert
18 февраля 2020
Поясните пожалуйста кто-нибудь эту магию, а то я что-то не догоняю зачем так сделано

if (Arrays. asList(array).contains(index)) return array[index]
. Ведь если у нас например такой массив, то выкидывает исключение

new Integer[]{5, 6, 7, 8}
Евгений Уровень 31
9 мая 2020
по-моему, здесь ошибка. Конструкция Arrays.asList(array).contains(index) будет искать в массиве значение, равное индексу. То есть, если у нас есть массив размера 5, состоящий из одних нулей {0, 0, 0, 0, 0}, и нас интересует индекс, равный 2 (в данном массиве он есть, т к его размер 5), то мы получим false, т к значения 2 в массиве нет (там только нули). Перепутаны понятия индекса и значения. Тот пример, когда рефакторинг сломал логику работы :) что касается задачи, то явно приводить к Number достаточно только второй член тернарного оператора: ? array[index] : (Number) (double) -1;
NodeOne Уровень 41 Expert
2 сентября 2018
Повторение - мать учения! - упырям которые ноют что их тут за их деньги плохо учат.
1 сентября 2026
Я вот ни разу не встречал комментарий с содержанием: "меня за деньги плохо учат". Вы придумали эти комментарии: заменили и обобщили. По сути, солгали. У людей претензии к качеству материала и к содержанию квеста. В частности, люди заметили, что объявленная тема данного квеста - многопоточность, а фактически многопоточности в нём очень мало. Можно тоже, как вы сделали, обобщить и заявить, что многопоточности сдесь нет! Основа квеста "многопоточность" - это упомянутое вами повторение материала из первого модуля (квеста). Кто мешает вам вернуться в первый квест и повторить материал, если вы считаете это необходимым? В общем, ваш комментарий не справедлив и не обоснован.