Let’s say I have a generic type alias with many parameters:
type G[P1 <: B1, P2 <: B2, ..., Pn <: Bn]
Each of the parameters is invariant, and there is no way for me to define an upper bound on it. Now, if I want to define a simple function that has and input and/or output of type G[...]
, can I avoid the boilerplate illustrated below with the identity function?
def identity[
P1 <: B1, P2 <: B2, ..., Pn <: Bn
](g: G[P1, P2, ..., Pn]): G[P1, P2, ..., Pn] = g
If there was a way to obtain the type UG
that is the union of G[P1 <: B1, P2 <: B2, ..., Pn <: Bn]
, for all P1 <: B1
, P2 <: B2
, … Pn <: Bn
, then one could conceivably write something like
def identity[T <: UG](g: T): T = g
, which would be much nicer.
P.S.: For a “real-world example”, see here.