Java中的泛型是否避免了所有ClassCastExceptins?
由于泛型只在Java 5的编译时进行检查,所以它们能在所有方面避免ClassCastException吗Java中的泛型是否避免了所有ClassCastExceptins?,java,generics,jdk1.6,classcastexception,Java,Generics,Jdk1.6,Classcastexception,由于泛型只在Java 5的编译时进行检查,所以它们能在所有方面避免ClassCastException吗 情况?否。使用Java 5.0和泛型类型不会使您的ClassCastException不受影响。首先,您应该确保您的代码在编译时不会出现未加密的警告。这是一个很好的指标。为了了解原因,我建议你看一下 其次,泛型无法保护您免受以下代码的攻击: public void methodOne(Integer argument) { methodTwo(argument); } pub
情况?否。使用Java 5.0和泛型类型不会使您的ClassCastException不受影响。首先,您应该确保您的代码在编译时不会出现未加密的警告。这是一个很好的指标。为了了解原因,我建议你看一下 其次,泛型无法保护您免受以下代码的攻击:
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
因此答案是否定的,仅仅通过正确使用泛型是无法摆脱类CastException的。Java 5泛型提供的“铁铸”保证是,如果编译没有产生“未检查”的警告,您将永远不会从编译器插入的类型转换中看到类CastException
在现实生活中,如果代码使用遗留(非泛型)库,通常无法避免未经检查的警告。然后编译器生成的强制转换可以抛出ClassCastException,您的工作是确保库代码返回的值对于您的声明类型正确,从而防止出现这种情况
否则情况就不会改变。在泛型之外,如果您强制转换为不兼容的类型,您将得到一个ClassCastException,方法与以前相同
(关于这个和其他泛型问题的一个很好的参考是。)不。泛型只能避免编译时错误,而不能避免运行时异常。如果根本不强制转换,就不应该看到任何ClassCastException。