我正在尝试定义一个异常类列表,如下所示:
private static final List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class);
我从Eclipse得到的错误是:
Type mismatch: cannot convert from List<Class<? extends RuntimeException>> to List<Class<? extends Exception>>
你能告诉我吗?我不明白为什么它不能将例外列表转换为例外列表...
答案 0 :(得分:2)
您应该使用:
List<Class<? extends RuntimeException>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class);
Arrays.asList
返回的泛型类型将始终使用最具体的类型,即RuntimeException
。如果您在列表中添加了已检查的异常,则此语句将变为:
List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(IOException.class, NumberFormatException.class, NullPointerException.class);
答案 1 :(得分:2)
+1 Reimeus's answer。但是,如果您希望保持使用父Exception
类型声明的列表,这是我能想到的最好的(使用Java 7语法):
private static final List<Class<? extends Exception>> SOME_ERRORS = new ArrayList<>();
static{
SOME_ERRORS.add(NumberFormatException.class);
SOME_ERRORS.add(NullPointerException.class);
}
您的问题是由于Arrays.asList
自动为您确定了正确的列表类型。为了进行比较,这也可以正常运行:
private static final List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class, Exception.class);
特别是处理“常量”(static final
s)时,通常最好建议您确保不能修改此类数组/集合。在最坏的情况下,这可以避免遇到一些困难的问题。例如:
private static final List<Class<? extends Exception>> SOME_ERRORS;
static{
List<Class< ? extends Exception>> errors = new ArrayList<>();
errors.add(NumberFormatException.class);
errors.add(NullPointerException.class);
SOME_ERRORS = Collections.unmodifiableList(errors);
}