Generic параметры

Так же как и у обобщенных классов, у методов есть полиморфизм по типу, с таким же синтаксисом (параметр типа указывается в квадратных скобках сразу после названия метода).

Пример:

def listOfDuplicates[A](x: A, length: Int): List[A] =
  if length < 1 then Nil
  else x :: listOfDuplicates(x, length - 1)

listOfDuplicates[Int](3, 4)
// res0: List[Int] = List(3, 3, 3, 3)
listOfDuplicates("La", 8)
// res1: List[String] = List("La", "La", "La", "La", "La", "La", "La", "La")

Метод listOfDuplicates принимает параметр типа A и параметры значений x и length. Значение x имеет тип A. Если length < 1 возвращается пустой список. В противном случае x добавляется к списку, возвращаемому через рекурсивный вызовов с length - 1. (Обратите внимание, что :: означает добавление элемента слева к списку справа).

В первом вызове метода явно указывается параметр типа - [Int]. Поэтому первым аргументом должен быть Int и тип возвращаемого значения будет List[Int].

Во втором вызове показано, что не обязательно всегда явно указывать параметр типа. Часто компилятор сам может вывести тип исходя из контекста или типа передаваемых аргументов. В этом варианте "La" - это String, поэтому компилятор знает, что A должен быть String.


Ссылки: