问题描述:
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异常