导航

Web 数据源

Posted on 2017-09-06 14:17  耍流氓的兔兔  阅读(197)  评论(0编辑  收藏  举报

问题描述:

 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异常