6

由于泛型仅在 Java 5 的编译时检查,它们能否在所有情况下避免 ClassCastExceptions?

4

4 回答 4

16

Java 5 泛型提供的“铸铁”保证是,如果编译没有产生“未经检查”的警告 ,您将永远不会从编译器插入的强制转换中看到 ClassCastException。

在现实生活中,如果您的代码使用遗留(非通用)库,您通常无法避免未经检查的警告。然后编译器生成的强制转换可能会抛出 ClassCastException,而您的工作是通过确保库代码返回的值对您的声明进行良好类型化来防止这种情况发生。

否则情况不变。在泛型之外,如果您强制转换为不兼容的类型,您将像往常一样获得 ClassCastException。

(对于这个和其他泛型问题的一个很好的参考是Java Generics and Collections。)

于 2009-08-14T11:10:58.030 回答
12

首先,您应该确保您的代码在编译时不会出现未经证实的警告。这是一个很好的指标。要了解原因,我建议您查看Effective Java 中的泛型示例章节

其次,泛型无法保护您免受以下代码的影响:

public void methodOne(Integer argument)  {
     methodTwo(argument);
} 

public void methodTwo(Object argument) {
     System.out.println(((Date) argument).getTime());
}

第三,如果您以某种方式使用类加载器,您可能会感到奇怪ClassCastExceptions,例如在这个讨论线程中。看到让人心烦意乱

java.lang.ClassCastException:javax.mail.Session 无法转换为 javax.mail.Session

所以答案是否定的,你不能仅仅通过正确使用泛型来摆脱ClassCastExceptions 。

于 2009-08-14T11:09:48.220 回答
2

不。使用 Java 5.0 和泛型类型并不能使您防 ClassCastException。

于 2009-08-14T11:00:22.077 回答
-1

没有。泛型只能让您避免编译时错误,而不是运行时异常。

于 2009-08-14T11:58:45.577 回答