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
Java中泛型数组创建总结的更多相关文章
- Java中泛型数组的使用
		
package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClass ...
 - Java中泛型 类型擦除
		
转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...
 - 慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组
		
来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 或者 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简 ...
 - 如何使用 Java 中的数组
		
Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 数据类型[ ] 数组名: 或者 数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指 ...
 - 【JAVA零基础入门系列】Day10 Java中的数组
		
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...
 - 第81节:Java中的数组
		
第81节:Java中的数组 本节介绍数组的基本概念,数据就是一种数据结构,可以用来存储多个数据,每个数组中可以存放相同类型的数据.比如,在学校,我们是一个班,这里的班级中每个同学都是这个班级数组中的元 ...
 - Java“禁止”泛型数组
		
Java“禁止”泛型数组 原文:https://blog.csdn.net/yi_Afly/article/details/52058708 1. 泛型定义泛型编程是一种通过参数化的方式将数据处理与数 ...
 - Java中的数组与集合
		
此文转载自:http://student-lp.iteye.com/blog/2082362 在java编程的过程中,我们不能确定某一类型的对象到底会需要多少,为了解决这个问题,java提供了容纳对象 ...
 - 【java】解析java中的数组
		
目录结构: contents structure [+] 一维数组 1,什么是一维数组 2,声明一维数组的三种方式 二维数组 1,什么是二维数组 2,声明二维数组的3种方式 3,二维数组的遍历示例 数 ...
 
随机推荐
- React日常填坑手册(持续更新)
			
1.react中自己定义的组件第一个字母一定要大写,如<app />会不显示,<App />才能正常显示. 2.在react中点击事件里面setState时会使this重新定义 ...
 - SpringMVC RequestMapping注解
			
1.@RequestMapping 除了修饰方法,还可以修饰类 2.类定义处:提供初步的请求映射信息.相对于WEB应用的根目录 方法处:提供进一步细分映射信息 相对于类定义处的URL.若类定义处未 ...
 - Python正则表达式返回首次匹配到的字符及查询的健壮性
			
re.findall(pattern,string)会搜索所有匹配的字符,返回的是一个列表,获取首个匹配需要re.findall(pattern,string)[0]访问, 但是如果findall没匹 ...
 - 模拟winform里的控件的事件和委托机制
			
参考:.NET 中的委托 委托的两大用处 1.委托可以实现方法作为参数进行传递,如 /// <summary> /// the English speaker. /// </summ ...
 - 申请的服务器安装tomcat后不能访问的问题
			
新申请的阿里云服务器,操作系统是CentOS6.5,安装jdk1.8版本,用java -version命令可以查看jdk版本,安装正确会有版本显示.然后安装tomcat,tomcat安装后默认端口是8 ...
 - Caused by: org.xml.sax.SAXParseException; systemId: file:/home/hadoop/hive-0.12.0/conf/hive-site.xml; lineNumber: 5; columnNumber: 2; The markup in the document following the root element must be well
			
1:Hive安装的过程(Hive启动的时候报的错误),贴一下错误,和为什么错,以及解决方法: [root@master bin]# ./hive // :: INFO Configuration.de ...
 - Nginx 显示502 Bad Gateway错误
			
今天系统发布到测试环境,有一个用户登录后显示502 Bad Gateway错误,其他的用户都登录成功.但是在开发机链接测试数据库,使用该账号登录成功. 初步猜测是Nginx的问题,查看nginx的错 ...
 - UML 类图基础
			
先留个坑, 后续再填 UML 类图中主要包括以下几种关系: 1. 泛化: 定义:继承关系,指定子类继承父类的所有特征与行为. 图形:三角形箭头,指向父类. 2. 实现 定义:类与接口的 ...
 - 读了前半本<Thinking in Java>
			
读了1-14章.这本书真的不适合初学者,可能比较适合有一两年Java经验的人来读.学习真的是一个螺旋递进的过程.刚开始学Java基本语法,书上看到的很多东西觉得过于细枝末节,没见过,用不上,导致书看不 ...
 - MkDocs项目文档生成器
			
简介 安装 我的配置 Chocolatey 简介 - Windows的包管理器 官方网址 安装 注意事项 Python 简介 安装 Pip 简介-Python的包管理器 升级 MkDocs的安装 使用 ...