Enum 派生クラスに暗黙的に宣言されるメソッド/メンバ関数である valueOf および values を
ジェネリックに呼び出す方法。
Java
次のような enum 型が定義されているとする。
public enum PrimaryColor {
    RED, GREEN, BLUE
}
具象型が分かっているときの呼び出し
public static void main(String... args) {
    PrimaryColor red = PrimaryColor.valueOf("RED"); // RED
    PrimaryColor[] values = PrimaryColor.values(); // [RED, GREEN, BLUE]
}
ジェネリックな呼び出し
public static <E extends Enum<E>> E valueOf(Class<E> enumType, String name) {
    return Enum.valueOf(enumType, name);
}
public static <E extends Enum<E>> E[] values(Class<E> enumType) {
    return enumType.getEnumConstants();
}
public static void main(String... args) {
    PrimaryColor red = valueOf(PrimaryColor.class, "RED"); // RED
    PrimaryColor[] values = values(PrimaryColor.class); // [RED, GREEN, BLUE]
}
Kotlin
次のような enum 型が定義されているとする。
enum class PrimaryColor {
    RED, GREEN, BLUE
}
具象型が分かっているときの呼び出し
fun main() {
    val red: PrimaryColor = PrimaryColor.valueOf("RED") // RED
    val values: Array<PrimaryColor> = PrimaryColor.values() // [RED, GREEN, BLUE]
}
ジェネリックな呼び出し
inline fun <reified E : Enum<E>> valueOf(name: String): E =
    enumValueOf<E>(name) // `<E>` は今回の場合は省略(型推論)可能
inline fun <reified E : Enum<E>> values(): Array<E> =
    enumValues<E>() // `<E>` は今回の場合は省略(型推論)可能
fun main() {
    val red: PrimaryColor = valueOf("RED")
    val values: Array<PrimaryColor> = values()
}
/以上