Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的泛型是否避免了所有ClassCastExceptins?_Java_Generics_Jdk1.6_Classcastexception - Fatal编程技术网

Java中的泛型是否避免了所有ClassCastExceptins?

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的编译时进行检查,所以它们能在所有方面避免ClassCastException吗
情况?

否。使用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。