• 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

  • 相关阅读:
    从电视剧《清平乐》聊聊宋仁宗和宋词
    也读《白鹿原》:望关中平原,窥民族秘史
    听说你在做数字化转型,了解中台一下不?
    刘润《商业洞察力30讲》学习总结
    《容器化.NET应用架构指南》脑图学习笔记(一)
    也聊春节:漫天红色与春晚变迁
    我的2019年终回顾:行道迟迟,载饥载渴,而立之年,持续刷新
    ASP.NET Core on K8S深入学习(11)K8S网络知多少
    ASP.NET Core on K8S深入学习(10)K8S包管理器Helm
    【译】gRPC vs HTTP APIs
  • 原文地址:https://www.cnblogs.com/onlysun/p/4531604.html
Copyright © 2020-2023  润新知