Чем чаще я пишу на Scala тем больше я понимаю недостатки и преимущества этого языка. Есть ряд не совсем очевидных тонкостей, которые могут усложнить переход на Scala с Java и создать проблемы новичкам.
Дабы упростить жизнь себе и другим на основе своего опыта я записал решения, которые часто применяю на практике.
- Невозможно создать массив на основе generic типа. Допустим есть у нас trait ‘Животное’ (Animal) иtrait ‘Группа животных’ (Animals). Для тех, кто плохо знаком со Scala, стоит отметить, что в данном примере trait’ы играют роль интерфейсов как в Java. У группы животных есть метод same, который принимает массив животных различных видов и возвращает массив таких животных, которые одного вида что и группа. Мне с ходу пришло такое решение:
Но, к сожалению, оно не работает. Проблема в методе same. Его реализация возвращает ArraySeq[T] вместо Array[T]. Можно пойти другим способом и реализовать метод same так:
Но и тут код не компилируется: «Cannot find class tag for element type T«. В подробности вдаваться не буду, но суть в том, что создать массив из generic типа мы не можем. А решение проблемы простое. Достаточно добавить «[T: ClassTag]» сразу после названия метода. Тогда и первый и второй варианты будут работать. Ниже представлен полный исправленный первый пример.
- Рассмотрим пример.
Есть Дельфин (Dolphin), который унаследован от класса Животное (Animal). У дельфина есть метод ‘подрасти’ (growUp), который принимает кол-во лет на которые нужно подрасти. Это количество лет метод прибавляет к переменной age. С точки зрения Java программиста код должен работать. Но Scala его не компилирует, поскольку считает что age в классе Dolphin — это переопределение. Для работы примера его нужно подправить следующим образом
- Продолжение следует…
Описанные тут решения далеко не совершенны, но на практике они проверены и работают. Вполне может быть так, что есть более грамотный подход. Как говорится — «Нет предела совершенству!».