2012-09-08 54 views
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>> 

莫非你请指教?我不明白为什么它不能例外列表转换到例外列表...

回答

2

+1 for 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); 
} 
+0

这让我感到惊讶。只要我添加了编译的FileNotFoundException.class代码。我仍然觉得很奇怪,但我想我现在明白为什么它是这样的。谢谢 –

+0

接受你对这条信息的回答“你的问题是由于Arrays.asList自动为你确定正确的列表类型。” –

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); 
+0

但是,不要运行时异常扩展异常吗?我清楚地想要扩展Exception类的任何异常类的列表。如果我将一个非运行时异常添加到列表中怎么办? –

+0

回答我自己的问题,添加一个非运行时异常到列表工作正常,突然编译。 –

+0

要回答你的问题,请参阅我的更新 – Reimeus