Java中泛型数组创建总结

在java中,可以声明一个泛型数组,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size)的方式来创建数组例如下面的程序。

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>();        }  

 /**        * @param args        */        public static void main(String[] args) {            /** Even though kind is stored as Class<T> , erasure means that it is actually just being stored as a Class, with        * no parameter. So, when you do some thing with it, as in creating an array, Array.newInstance( ) doesn’t         * actually have the type information that’s implied in kind; so it cannot produce the specific result, which               * must therefore be cast, which produces a warning that you cannot satisfy.               */               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";           }     }   

程序一:这个程序主要说明了,在使用泛型数组中容易出现的问题,由于书中对于程序的说明比较详细,所以只对程序做引用。

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抛出。

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);
     /* will throw ClassCastException */                 // String[] strs = aog2.rep();                   //System.out.println(strs);
    }
  }   

程序三:主要说明在对象中通过用Object[]来保存数据,则生成对象是,可以对其持有的对象在T和object之间进行转换,但是当设计到数组的转换时,还是会报ClassCastException

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);
   }
 }   

程序四:是对泛型数组相对而言比较完美的解决方案

public class ArrayOfGeneric4<T> {
       T[] ts;
      public ArrayOfGeneric4(Class<T> type, int size) {
      /* to solution array of generic key code! */
      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();
     }
   }
  }   

原文请见http://developer.51cto.com/art/201202/317813.htm

时间: 2024-10-12 15:32:33

Java中泛型数组创建总结的相关文章

Java中泛型数组的使用

package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClassDefine3<T, S extends T> { public static void main(String[] args) { // 这个会有warning: TestClassDefine3<String, String>[] tcd3 = new TestClassDefin

Java中泛型 类型擦除

转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下面一个列子,代码如下: public class Foo { public void listMethod(List<String> stringList){ } public void listMethod(List<Integer> intList) {

将Java中的数组进行二次封装成属于我们自己的数组

我们来简略回顾一下Java数组的基础概念: 数组最大的优点是可以快速查询,因为数组直接通过索引查询很快:array[2],所以在随机访问时有一定的优势.其数据结构是简单的线性序列,这使得元素访问非常快速,并且按照索引遍历数组方便 数组最好应用于"索引有语意"的情况 但并非所有有语意的索引都适用于数组,例如索引是身 份 证号这种长度的数字,就无法作为索引使用 而数组也同样可以处理"索引没有语意"的情况 数组的缺点: 根据内容查找元素速度慢 数组的大小一经确定不能改变

慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组

来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  或者  其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指定数组中最多可存储多少个元素 语法:  其中,数组长度就是数组中能存放元素的个数,如: 话说,我们也可以将上面的两个步骤合并,在声明数组的同时为它分配空间,如: 3. 赋值 分配空间后就可以向数组中放数据了,数组中元素都是通过下标来访问的,例如向 scores 数组中存放学生成绩 4.

Java 中 泛型的限定

泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中,  越是 单一 约好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 泛型的限定上限: <? extends E> 接受 E 或者 E 的子类型. 泛型的限定下限: <?  super   E>  接收  E 或者 E 的父类. 泛型的限定上限 (定义父类 填装子类 类型!) 代码: package stu.love.v; import java

【java】解析java中的数组

目录结构: contents structure [-] 一维数组 1,什么是一维数组 2,声明一维数组的三种方式 二维数组 1,什么是二维数组 2,声明二维数组的3种方式 3,二维数组的遍历示例 数组在内存中的空间分配情况 各种数据类型在声明完毕后的默认初始值 解析数组中length属性 java中的数组是对象吗 创建数组对象的模板在哪里 java数组中.lenght属性的来源 参考文章 1,一维数组 1.1 什么是一维数组 一维数组就是在内存连续分配的一段存储空间. 1.2 声明一维数组的三

Java基础---使用循环操作Java中的数组(三十一)

使用循环操作 Java 中的数组 实际开发中我们经常使用循环控制数组成员的操作.如:  运行结果:  其中,  用于获取数组的长度 需要注意的"小毛病": 1. 数组下标从 0 开始.因此 scores[3] ,表示数组中的第 4 个元素,而并非第 3 个元素 2. 数组下标的范围是 0 至 数组长度-1 ,如果越界访问,就会报错.如: 运行时会报如下错误: 上面错误信息的意思是数组下标超过范围,即数组访问越界.在上面的代码中创建一个长度为 2 的数组,因此数组下标范围是 0 到 1

Java中的数组和方法

3.1 数组的定义和使用 数组(Array)是用来存储一组相同数据类型数据的集合.数组中的每个数据称为一个元素(element),数组可以分为一维数组,二维数组和多维数组.我们 主要讲解一维数组和二维数组. 3.1.1一维数组的声明数组变量 Java中的数组必须先声明然后再使用,Java中声明数组的方式如下: datatype[] arrayRefVar; 或者 datatype arrayRefVar[]; 例如: double[] array; 或者 double array[]; 说明:我

如何使用 Java 中的数组

Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  数据类型[ ] 数组名: 或者   数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指定数组中最多可存储多少个元素 语法:  数组名 = new  数据类型 [ 数组长度 ]; 其中,数组长度就是数组中能存放元素的个数,如: 话说,我们也可以将上面的两个步骤合并,在声明数组的同时为它分配空间,如: 3. 赋值 分配空间后就可以向数组中放数据了,数组中元素都是通过下标来访问的,例如向