我有一个类EnumConverter<T extends Enum<?>>将字符串转换为枚举T的正确枚举常量(我不能使用Enum.valueOf)。我在工厂方法中构造此类的实例,如下所示:

public static <T extends Enum<?>> EnumConverter<T> getInstance(Class<T> enumClass) {
    return new EnumConverter<T>(enumClass.getEnumConstants());
}


这可行,但是现在我想缓存EnumConverter实例以确保每个枚举只有一个,即使用Map,而我的问题是如何声明此Map。我最接近的是:

private static final Map<Class<?>, EnumConverter<? extends Enum<?>>>


但是,如果尝试从工厂方法中的此Map返回值,则会收到错误消息:


  Type mismatch: cannot convert from EnumConverter<capture#1-of ? extends Enum<?>> to EnumConverter<T>


有任何想法吗?

最佳答案

当您要在映射中存储不同的子类型时,编译器无法知道您正在接收的实际子类型。我认为您必须添加演员表:

public static <T extends Enum<?>> EnumConverter<T> getInstance(Class<T> enumClass) {
    return (EnumConverter<T>) cache.get(enumClass);
}

10-08 13:23