论坛首页 编程语言技术论坛

java动态类型安全

浏览 1314 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-08-14  
当想集合中插入一个组数据的时候,除了可以明确的指定类型(如List<Integer>)外,还可以使用java.util.Collections提供的方法来检查尅性。包括的静态方法有

checkedCollection(Collection<E> c, Class<E> type) 
checkedList(List<E> list, Class<E> type) 
checkedMap(Map<K,V> m, Class<K> keyType, Class<V> valueType) 
checkedSet(Set<E> s, Class<E> type) 
checkedSortedMap(SortedMap<K,V> m, Class<K> keyType, Class<V> valueType) 
checkedSortedSet(SortedSet<E> s, Class<E> type) 


   这些方法的每一个都会将你希望动态检查的容器当做第一个参数接受,将你希望强制要求的类型作为第二个参数。
    在你试图插入不正确的类型的时候就会产生类型转化异常(ClassCastException),例如

List<Dog> dogs2=Collections.checkedList(new ArrayList<Dog>(), Dog.class);
dog2.add(new Cat());


    当你试图防止Dog的类中插入Cat时候就会报异常。但是将导出类放置到容器里里面可以正常运行

    我的疑问:
他的实现原理是什么样的呢,没找到JDK中对应的实现。
   发表时间:2012-08-16  
实现就在Collections.java里呀
    public static <E> List<E> checkedList(List<E> list, Class<E> type) {
        return (list instanceof RandomAccess ?
                new CheckedRandomAccessList<E>(list, type) :
                new CheckedList<E>(list, type));
    }

    static class CheckedList<E> extends CheckedCollection<E>
                                implements List<E>
    {
         ...
         public void add(int index, E element) {
            typeCheck(element);
            list.add(index, element);
        }
        ...
    }
    ...
    static class CheckedCollection<E> implements Collection<E>, Serializable {
        private static final long serialVersionUID = 1578914078182001775L;

        final Collection<E> c;
        final Class<E> type;

        void typeCheck(Object o) {
            if (!type.isInstance(o))
                throw new ClassCastException("Attempt to insert " +
                   o.getClass() + " element into collection with element type "
                   + type);
        }

        CheckedCollection(Collection<E> c, Class<E> type) {
            if (c==null || type == null)
                throw new NullPointerException();
            this.c = c;
            this.type = type;
        }
     ...



CheckedCollection是一个wrapper,持有一个原始的Collection和元素类型信息type。然后它的子类在添加元素时根据这个type对新元素进行类型检查。这种运行时检查是占用额外的内存和CPU时间的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics