Generic structs can be declared to hold generic types, and generic functions can be declared to take generic types as arguments.
Generics must be specialized when used; but, because of type inference, annotation is usually not required. When that's not the case, structs can be specialized via type annotation, and functions can be specialized passing the generic arguments using this syntax ::<T, U, ..>
.
{generics.play}