定义异常类列表 - 类型不匹配错误

时间:2012-09-08 13:16:10

标签: java list exception generics type-conversion

我正在尝试定义一个异常类列表,如下所示:

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>>
你能告诉我吗?我不明白为什么它不能将例外列表转换为例外列表...

2 个答案:

答案 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);
}