2

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

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>>

您能否提一些建议?我不明白为什么它不能将异常列表转换为异常列表......

4

2 回答 2

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);
于 2012-09-08T13:20:39.550 回答
2

+1 为Reimeus 的回答。但是,如果您希望保留使用父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 finals)时,通常最好建议您确保此类数组/集合不能被修改。在最坏的情况下,这可以避免遇到一些困难的问题。例如:

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);
}
于 2012-09-08T13:22:49.947 回答