Generics pains
I am trying to create an options class that manages options for a
project. In this class, the options are internally stored as Strings that
can be cast to (depending on circumstances) integers, booleans, or even
enums. However, I am having trouble getting the code to compile:
public final class Options {
private Options() {}
private static HashMap<String, String> opts = new HashMap<String,
String>();
private static HashMap<String, Class<?>> types = new HashMap<String,
Class<?>>();
public static String getOption(String name) {
return opts.get(name);
}
public static <T extends Enum<T>> T getAsEnum(String name) {
Class<?> c = types.get(name);
if (!c.isEnum())
throw new RuntimeException("Option "+name+" is not an enum!");
Class<T> ec = c.asSubclass(Enum.class);
return Enum.valueOf(ec, getOption(name));
}
}
The exact error:
C:\Documents and Settings\Josh\Desktop\Programming\Java\Decompiler_new
\util\Options.java:43: incompatible types
found : java.lang.Class<capture of ? extends java.lang.Enum>
required: java.lang.Class<T>
Class<T> ec = c.asSubclass(Enum.class);
^
If it helps, this is one of the intended usages:
// Options.opts has pair "log","ERROR"
// and Options.types has pair "log",LogLevel.class
// via my options scheme
@Option("log",LogLevel.class,"ERROR")
public class Logger {
// various methods
private static void log(String message, LogLevel severity) {
if (severity.ordinal() < Options.getAsEnum("log").ordinal())
return;
// log the message somehow
}
private enum LogLevel {
ERROR, WARNING, VERBOSE, DEBUG;
}
}
P.S. I know my error-handling is as of right now unacceptable; I am going
to start fixing that once I implement my logger, for which I need my
getAsEnum function to work.