package main

import "fmt"

type Kotak[T any] struct {
	Isi T
}

// Method generik pada tipe konkret sudah sah sejak Go 1.27.
func (k Kotak[T]) Ubah[U any](f func(T) U) Kotak[U] {
	return Kotak[U]{Isi: f(k.Isi)}
}

// Interface method tidak boleh memiliki type parameter sendiri.
type Pengubah interface {
	Ubah[U any](f func(int) string) Kotak[string]
}

func main() {
	var p Pengubah = Kotak[int]{Isi: 21}
	fmt.Println(p.Ubah(func(n int) string { return fmt.Sprint(n) }))
}
