A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵中国 中级黑马   /  2012-3-31 14:10  /  1810 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
public class Array<T>
{
        private T[] array;
        @SuppressWarnings("unchecked")
        public Array(int sz){
        array = (T[])new Object[sz];
        }
        public void put(int index ,T item){
                array[index] = item;
        }
        public T get(int index){
        return array[index];
        }
        public T[] rep(){
        return array;
        }

        public static void main(String[] args)
        {
                Array<Integer> ga = new Array<Integer>(10);
                Integer[] ia = ga.rep();
                 
                System.out.println(ia.length);
        }

}
错误提示:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; can
not be cast to [Ljava.lang.Integer;
        at Array.main(Array.java:25)

2 个回复

倒序浏览
所谓泛型的作用范围就是在编译期,控制数据类型。
当你运行的时候就这些“类型”信息自动去除。
  1. public class Arr<T>
  2. {
  3.         private T[] array;

  4.         @SuppressWarnings("unchecked")
  5.         public Arr(int sz)
  6.         {
  7.                 array = (T[]) new Object[sz];
  8.         }

  9.         public void put(int index, T item)
  10.         {
  11.                 array[index] = item;
  12.         }

  13.         public T get(int index)
  14.         {
  15.                 return array[index];
  16.         }

  17.         public T[] rep()
  18.         {
  19.                 return array;
  20.         }

  21.         public static void main(String[] args)
  22.         {
  23.                 Arr<Integer> ga = new Arr<Integer>(10);
  24.                
  25.                 for(int i=0;i<10;i++)
  26.                 {
  27.                         ga.put(i,i+1);
  28.                 }
  29.                
  30.                 Object[] s=ga.rep();
  31.                
  32.                 for(int i=0;i<10;i++)
  33.                 {
  34.                         System.out.print(s[i]+" ");
  35.                 }
  36.         }
  37. }
复制代码
回复 使用道具 举报
本帖最后由 何万县 于 2012-3-31 19:17 编辑

在java中,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Class<t>type,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, wh ich            
* 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";
        }   
}   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马