-
使用泛型的时候,如果内部是通过封装数组实现的,就会遇到不能实例化泛型数组的问题,不能
new Object[DEFAULT_INITIAL_CAPACITY]
-
解决不能实例化泛型数组有两个方法,在创建时候强转和在使用时候强转
public class Stack<E> { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; @SuppressWarnings("unchecked") public Stack() { elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; }
public class Stack<E> { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public E pop() { if (size == 0) throw new EmptyStackException(); // push requires elements to be of type E, so cast is correct @SuppressWarnings("unchecked") E result = (E) elements[--size]; elements[size] = null; // Eliminate obsolete reference return result; }
- 方法一的优势是可读性想并且更加简洁,在开发中可以尽量使用第一种写法。第一种写法的缺点是堆污染(heap pollution),后面章节会讲到
思考
这节的题目虽然叫优先使用泛型,主要讲的其实是使用泛型的注意点。总体上感觉其实实际开发中并不太会碰到。首先泛型数组,至少我自身不会用到,如果真的碰到了就使用List
。对于可变参数是一个List
的数组,印象中之前出现过,只要保证不改变类型的情况下,简单的遍历是不会出错的
网友评论