问题描述:
![](https://images2017.cnblogs.com/blog/849803/201709/849803-20170906140158710-1144626230.png)
ClassCastException:类型转换异常
问题代码:
private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>());
问题分析:
点进去查看文档:
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<>(list) :
new SynchronizedList<>(list));
}
Collections.synchronizedList()方法的返回值是List<T>,我们直接使用List<Connection>来接收方法的返回值,编译通过,运行无异常
我们查看LinkenList是否实现了RandomAccess
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
可以看到LinkedList并没有实现RandomAccess接口,所以,方法的返回值为SynchronizedList的实例
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E>
我们可以看到,LinkedList和SynchronizedList之间并没有继承的关系,所以,无法进行强制类型转换
问题总结:
引用变量的强制类型转换:
(type)variable:将variable变量转换成一个type类型的变量
或者将一个引用变量类型变量转换成其子类类型
引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时出现错误。如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常