Объявление параметра типа F[_] <: Int
означает, что каждый экземпляр F
должен быть подтипом Int
. Это правильно в синтаксисе, хотя crypti c: F
не обязательно должен быть подтипом Int
; F[_]
должен быть подтипом Int
(для всех типов, которые могут быть помещены в _
). Примером такого F
является тот, который всегда возвращает Int
:
type ConstInt[X] = Int
h[ConstInt] // compiles
Обратите внимание, что вы можете указать тип в _
. Например, я могу объявить параметр типа F[X] <: X
. X
является локальным по отношению к объявлению, определяется появлением под F
слева, используется как граница справа и впоследствии выходит за пределы области видимости. Этот пример означает, что F[X]
должен быть подтипом X
, например, как
def f[F[X] <: X] = ???
type Identity[X] = X
f[Identity] // works
type ConstNothing[X] = Nothing
f[ConstNothing] // works
// f[ConstInt] (ConstInt[X] = Int is not always a subtype of X; counterexample X = AnyRef)
Возможно, это помогает понять, что должна означать граница.