Scala - параметры типа метода
Я пытаюсь понять какой-то автоматически сгенерированный код компилятором scala, но я не знаю, после чего искать.
У меня есть следующий класс:
trait Arrow1[F[_, _]]
abstract class Test {
def f1[F[_, _] : Arrow1, A, B, C](fa: F[A,B], fb: F[A, C]): F[A, (B, C)]
def f2[A: Seq, B](a: A): Boolean
}
После того как я декомпилировал файл класса, сигнатура методов f1 и f2 выглядит следующим образом:
public abstract class Test {
public abstract <F, A, B, C> F f1(F var1, F var2, Arrow1<F> var3);
public abstract <A, B> boolean f2(A var1, Seq<A> var2);
}
Как видите, у методов есть дополнительный параметр. Где я могу найти некоторую документацию по этому обозначению параметра типа метода F [_, _]: Arrow1?
1 ответ
Вы ищете "границы контекста".
Когда вы смотрите "Параметры типа" в спецификации, вы сталкиваетесь A: B
в первом абзаце, и вы также получите ссылку на границы контекста и границы представления, где написано(Цитата немного изменена, упрощено для случая с одной границей контекста):
Параметр типа
A
метода или класса, не являющегося чертой, может также иметь одну или несколько границ контекстаA : T
, В этом случае параметр типа может быть создан для любого типаS
для которого существуют доказательства в момент создания экземпляра, чтоS
удовлетворяет ограниченияT
, Такое доказательство состоит из неявного значения с типомT[S]
,Метод или класс, содержащие параметры типа с границами представления или контекста, рассматриваются как эквивалентные методу с неявными параметрами. Сначала рассмотрим случай одного параметра с [...] контекстными границами, такими как:
def f[A: U1](params): R = ...
Затем приведенное выше определение метода расширяется до
def f[A](params)(implicit v1: U1[A]): R = ...
где
v1
это новое имя для недавно введенного неявного параметра. Этот параметр называется параметром доказательства.
Вот ссылка на FAQ с дополнительной информацией по теме.