在java中,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Class<t>type,int size)的方式来创建数组例如下面的程序
[java] view plain copy print ?
- public class ArrayMaker<T> {
- private Class<T> type;
-
- public ArrayMaker(Class<T> type) {
- this.type = type;
- }
-
- @SuppressWarnings("unchecked")
- T[] createArray(int size) {
- return (T[]) Array.newInstance(type, size);
- }
-
- List<T> createList() {
- return new ArrayList<T>();
- }
-
-
-
-
- public static void main(String[] args) {
-
-
-
-
-
-
- ArrayMaker<Type> am2 = new ArrayMaker<Type>(Type.class);
- System.out.println(Arrays.asList(am2.createArray(10)));
- System.out.println(Arrays.asList(am2.createList()));
- }
-
- }
-
- class Type {
- @Override
- public String toString() {
- return "type";
- }
- }
上面的这个例子比较简单,但是如果你有接触过泛型数组,你便对他的复杂度有一定的了解,由于创建泛型数组比较复杂,所以在实际的应用过程中一般会选择List的对泛型进行存储,如果实在需要使用泛型数组,则需要注意数组的在运行时的类型,think in java这本书中,对泛型数组的处理通过四个小程序对其进行了比较完整的描述
程序一:这个程序主要说明了,在使用泛型数组中容易出现的问题,由于书中对于程序的说明比较详细,所以只对程序做引用
[java] view plain copy print ?
- class Generic<T> {
- }
-
- public class ArrayofGeneric {
- public static void main(String[] args) {
- Generic<Integer>[] genArr;
-
-
-
-
-
-
-
-
-
- genArr = (Generic<Integer>[]) new Generic[2];
- System.out.println(genArr);
- }
- }
程序二:这个程序主要是说明在程序的执行过程中,泛型数组的类型信息会被擦除,且在运行的过程中数组的类型有且仅有Object[],如果我们强制转换成T[]类型的话,虽然在编译的时候不会有异常产生,但是运行时会有ClassCastException抛出
[java] view plain copy print ?
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class ArrayOfGeneric2<T> {
- public T[] ts;
-
- public ArrayOfGeneric2(int size) {
- ts = (T[]) new Object[size];
- }
-
- public T get(int index) {
- return ts[index];
- }
-
- public T[] rep() {
- return ts;
- }
-
- public void set(int index, T t) {
- ts[index] = t;
- }
-
- public static void main(String[] args) {
- ArrayOfGeneric2<String> aog2 = new ArrayOfGeneric2<String>(10);
- Object[] objs = aog2.rep();
- System.out.println(objs);
-
-
-
- }
-
- }
程序三:主要说明在对象中通过用Object[]来保存数据,则生成对象是,可以对其持有的对象在T和object之间进行转换,但是当设计到数组的转换时,还是会报ClassCastException
[java] view plain copy print ?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class ArrayOfGeneric3<T> {
- Object[] ts;
-
- public ArrayOfGeneric3(int size) {
- ts = new Object[size];
- }
-
- public T get(int index) {
- return (T) ts[index];
- }
-
- public T[] rep() {
- return (T[]) ts;
- }
-
- public void set(int index, T t) {
- ts[index] = t;
- }
-
- public static void main(String[] args) {
- ArrayOfGeneric3<Integer> aog2 = new ArrayOfGeneric3<Integer>(10);
- Object[] objs = aog2.rep();
- for (int i = 0; i < 10; i++) {
- aog2.set(i, i);
- System.out.println(aog2.get(i));
- }
- Integer[] strs = aog2.rep();
- System.out.println(strs);
- }
- }
程序四:是对泛型数组相对而言比较完美的解决方案
[java] view plain copy print ?
-
-
-
-
-
-
-
-
-
-
-
- public class ArrayOfGeneric4<T> {
-
- T[] ts;
-
- public ArrayOfGeneric4(Class<T> type, int size) {
-
- ts = (T[]) Array.newInstance(type, size);
- }
-
- public T get(int index) {
- return ts[index];
- }
-
- public T[] rep() {
- return ts;
- }
-
- public void set(int index, T t) {
- ts[index] = t;
- }
-
- public static void main(String[] args) {
- ArrayOfGeneric4<Integer> aog2 = new ArrayOfGeneric4<Integer>(Integer.class, 10);
- Object[] objs = aog2.rep();
- for (int i = 0; i < 10; i++) {
- aog2.set(i, i);
- System.out.println(aog2.get(i));
- }
- try {
- Integer[] strs = aog2.rep();
- System.out.println("user Array.newInstance to create generci of array was successful!!!!! ");
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
泛型这一章节的内容从擦除开始,觉得都是非常的难懂,如果哪位同志有比较好的建议,希望能不惜指教!