Метод filter
на List
s является примером параметрического полиморфизма. Подпись
def filter(p: (A) ⇒ Boolean): List[A]
Работает одинаково для всех типов A
. Поскольку он может быть параметризован любым типом A
, это обычный параметрический полиморфизм.
Такие методы, как map
, используют оба типа полиморфизма одновременно.
Полная подпись map
:
final def map[B, That]
(f: (A) ⇒ B)
(implicit bf: CanBuildFrom[List[A], B, That])
: That
Этот метод основан на наличии неявного значения (CBF-гизмо), поэтому это специальный полиморфизм. Однако некоторые из неявных методов, которые предоставляют CBF правильного типа, сами по себе параметрически полиморфны в типах A
и B
. Поэтому, если компилятору не удастся найти какую-то очень специальную специальную конструкцию, такую как CanBuildFrom[List[String], Int, BitSet]
в неявной области видимости, он рано или поздно вернется к чему-то вроде
implicit def ahComeOnGiveUpAndJustBuildAList[A, B]
: CanBuildFrom[List[A], B, List[B]]
Поэтому, я думаю, можно сказать, что это своего рода "гибридный параметрический-специальный полиморфизм", который сначала пытается найти наиболее подходящий класс специального типа CanBuildFrom[List[A], B, That]
в неявной области видимости, но в конце концов отступает к обычному параметрическому полиморфизму и возвращает универсальное CanBuildFrom[List[A], B, List[B]]
-раствор, который параметрически полиморфен как в A
, так и B
.