在Java中实现ArrayList的类型擦除
我在
Java Generics上阅读这篇文章,并提到ArrayList的构造函数看起来有点像这样:
class ArrayList<V> { private V[] backingArray; public ArrayList() { backingArray = (V[]) new Object[DEFAULT_SIZE]; } } 我无法理解如何解释编译器的类型擦除和类型检查.我得到的一点是,type参数被转换为Object类型. 我会想像它(用Object替换所有V),但这绝对是错误的. class ArrayList<Object> { private Object[] backingArray; public ArrayList() { backingArray = (Object[]) new Object[DEFAULT_SIZE]; } } 它如何转换为对象类型,但仍然保留V的类型安全? 解决方法
您的类型已擦除版本不正确.类型参数声明不会被清除到对象,只有它的使用被删除.进一步来说:
>通用类型的擦除是其相应的原始类型.因此,对于ArrayList V,它将只是ArrayList. 所以,正确的擦除版本将是: class ArrayList { private Object[] backingArray; public ArrayList() { backingArray = (Object[]) new Object[DEFAULT_SIZE]; } }
不,这是永远不会的.编译器只生成通用类型或方法的一个字节代码表示,并将通用类型或方法的所有实例映射到唯一表示.
当编译器执行类型擦除时,它将根据一些预定义的规则删除所有类型的信息,偶尔添加所谓的bridge方法,并添加所需的所有必需的类型转换. 因此,例如,ArrayList< Integer>的以下用法和ArrayList< String> ;::: ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); int value = list.get(0); ArrayList<String> list2 = new ArrayList<String>(); list.add("A"); String value2 = list.get(0); 将被转换为有点像这样: ArrayList list = new ArrayList(); list.add(1); int value = (Integer) list.get(0); ArrayList list2 = new ArrayList(); list.add("A"); String value2 = (String) list.get(0); 进一步阅读: > Java Generics FAQs – What is Type Erasure? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |