Skip to content

Goの型パラメータは型パラメータ以外には利用できない

// 型変数から別の型変数を参照しようとするとコンパイルエラーになる
// cannot use a type parameter as constraint
func ConvertSliceType[S any, T S](xs []T) []S

この場合は型制約として S を参照しているが、使えない。回避するには関数を挟めばいい。

type Str string
func (s Str) String() string { return string(s) }
func ConvertSliceTypeWithFunc[S ~[]E, F func(E) I, E, I any](xs S, fn F) []I {
a := make([]I, len(xs))
for i, v := range xs {
a[i] = fn(v)
}
return a
}

ジェネリックな型エイリアスでも、言語仕様

type A[P any] = P // illegal: P is a type parameter

これも型を定義しようとしているが、できない。おそらく

type Ints interface { ~int | ~uint }
var n Ints // これはできない

ができない理由と同じで、型制約は型パラメータの制約としてのみ許されているのではないか。