Java Generics扩展了两个包含枚举的类

Rog*_*gue 0 java generics enums

我正在尝试为用户定义的Enums创建一个接口来实现,这样他们都可以使用一个公共的ConfigurationLoader类作为它们的配置值,但是我似乎无法声明一个Class<?>在方法参数中扩展两个子类的变量(jdk 1.8) ,接口中可以使用静态方法).

我需要同时拥有两者的原因是我希望能够保证枚举实际上实现了ConfigMarker接口,但也是一个我可以调用的枚举values().我怎样才能理解它有两个子类?

public interface ConfigMarker {

    public String getPath();

    public Object getDefault();

    public static void setDefaults(FileConfiguration file, Class<? extends Enum & ConfigMarker> clazz) {
        try {
            Method m = clazz.getMethod("values");
            m.setAccessible(true);
            for (ConfigMarker conf : (ConfigMarker[]) m.invoke(null)) {
                if (!file.isSet(conf.getPath())) {
                    file.set(conf.getPath(), conf.getDefault());
                }
            }
        } catch (NoSuchMethodException ex) {
            // numerous other exceptions that are caught, irrelevant.    
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

特定的编译时错误指出"类型参数的数量错误,预期为1".我知道可以指定多个&,所以为什么它在这里失败?

编辑

根据下面的答案,我能够解析类型,但我似乎无法调用方法本身:

public enum ConfigValue implements ConfigMarker {...}

public ConfigurationLoader(Main project, ConfigMarker marker) {
    //...
    marker.setDefaults(file, ConfigValue.SOME_VALUE.getDeclaringClass());
    //or
    marker.setDefaults(file, ConfigValue.class);
}
Run Code Online (Sandbox Code Playgroud)

fge*_*fge 5

您想在方法上声明一个类型变量:

public static <T extends Enum<T> & ConfigMarker> void setDefaults(FileConfiguration cfg, Class<T> c)
Run Code Online (Sandbox Code Playgroud)

(注意:这Enum<T>是我的预感)