Когда я пишу код на питоне, мне не нужно знать, элементы какого типа содержатся в конкретном списке. Это легко могут быть даже элементы разных типов, в хаотичном порядке. Меня волнует только то что это список. Или даже только то что я могу проитерировать этот объект. Утинная типизация в чистом виде.
В Java, мы не можем позволить себе такой вольности: массив содержащий строки и массив содержащий целые числа - это две разные вещи, имеющие одинаковый интерфейс, и мы должны указывать явно, объекты какого типа будут содержаться в нашем контейнере (массиве, списке, стеке, множетестве и т.д), и принимающая функция так же должна знать что мы в неё передаём. Это называется дженериками, или в более общем виде обобщённым программированием.
Что очень важно, List в терминах обобщённого программирования не является типом, он является контейнером принимающим любой тип A, что записывается как List[A] (в Scala). Людям пришедшим из мира динамических языков можно думать об этих квадратных скобках, как об отдельном списке параметров, который принимает только типы, и это в общем-то так и есть: существуют типовые параметры (type parameters) и параметры значений (value parameters), то есть привычные нам аргументы функций/классов. Если на месте типового параметра стоит готовый тип (concrete), такой как Int, String, Person, то это List[Person] будет уже не контейнером, а тоже готовым типом.
Scala ведёт себя так же как Java, но только представляет в этом плане значительно большие возможности и позволяет писать значительно меньше кода.
В Scala в отличие от других статических языков (читай Java) типы появляются только там, где они нужны, что выражается в уменьшении количества шаблонного кода. Если последнее выражение в функции возвращает объект типа Animal, то очевидно функция всегда возвращает Animal, и следовательно если мы присвоим какой-то переменной значение этой функции, то нам не надо явно указывать, какого она типа. Это и так всем понятно. Шаблонный код можно не писать (есть довольно много исключений, но это всё отдельные истории). Такое свойство языка называется type interference.