Просто для спортивного интереса проверил в 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 но и др. строготипизированых ЯП). Хотя если поразмыслить логически то это вполне резонно и ясно, что сделано это специально как раз из-за строгой типизации, типобезопасности и единообразия так сказать.
П/С: Как тут можно добавлять спойлер?
На Хабре нет ни одной статьи, пригодной для первоначального изучения темы. Эта статья не исключение: она путанная и многословная. Только уже будучи специалистом, можно их использовать, чтобы закрывать пробелы в знаниях, например. Или для общего развития. Их пишут, по сути, студенты, которые знают тему, а не преподаватели, цель которых правильно преподнести материал.
В общем, я не встретил ни одной годной, в качестве учебного материала, статьи на Хабре.
PS Тернарный оператор из задачи всегда будет возвращать Double.
Кстати, я тоже прочитал статью на хабре, разъясняющую работу тернарного оператора.😄
Если говорить очень грубо, то суть в том, что тернарный оператор всегда должен возвращать конкретный тип значения, т.к. в отличие от обычного if-else он может использоваться внутри выражений. Поэтому он не будет возвращать Integer или Double, а будет оборачивать оба варианта в Double (потому что он считает этот тип более точным - как-то так).
В соответствии с описанием работы тернарного оператора, обе части возвращаемого значения должны быть одинакового типа.
То есть у нас тут значение Integer неявно кастуется (упаковывается автобоксингом) в Double при возвращении. Надо дописать явно приведение и инта и дубля к (Number).
(Number) array[index] : (Number) new Double(-1);
Но, нам же говорили на прошлой лекции про нечитаемый код, выкидываемый при рефакторинге, потому надо сделать более глубокий рефакторинг вида:
if (Arrays. asList(array).contains(index)) return array[index]
по-моему, здесь ошибка. Конструкция Arrays.asList(array).contains(index) будет искать в массиве значение, равное индексу. То есть, если у нас есть массив размера 5, состоящий из одних нулей {0, 0, 0, 0, 0}, и нас интересует индекс, равный 2 (в данном массиве он есть, т к его размер 5), то мы получим false, т к значения 2 в массиве нет (там только нули). Перепутаны понятия индекса и значения. Тот пример, когда рефакторинг сломал логику работы :)
что касается задачи, то явно приводить к Number достаточно только второй член тернарного оператора: ? array[index] : (Number) (double) -1;
Я вот ни разу не встречал комментарий с содержанием: "меня за деньги плохо учат".
Вы придумали эти комментарии: заменили и обобщили. По сути, солгали.
У людей претензии к качеству материала и к содержанию квеста.
В частности, люди заметили, что объявленная тема данного квеста - многопоточность, а фактически многопоточности в нём очень мало. Можно тоже, как вы сделали, обобщить и заявить, что многопоточности сдесь нет! Основа квеста "многопоточность" - это упомянутое вами повторение материала из первого модуля (квеста). Кто мешает вам вернуться в первый квест и повторить материал, если вы считаете это необходимым?
В общем, ваш комментарий не справедлив и не обоснован.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ