我正在尝试为用户定义的Enums创建一个接口,以便他们都可以使用通用的ConfigurationLoader类来配置它们,但是我似乎无法声明一个扩展为2的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.
}
}
}
特定编译时错误指出“类型参数的数量错误,预期为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);
}
答案 0 :(得分:5)
您想在方法上声明一个类型变量:
public static <T extends Enum<T> & ConfigMarker> void setDefaults(FileConfiguration cfg, Class<T> c)
(注意:Enum<T>
是我的预感)