class pair<T extends Comparable>
{   public T first;
     private Object da[]=new Object[2];
 pair( T first){
       this.first=first;
 }
 public T get(int n){return  (T)da[n]; }
 public void set(int  n,T a){
         da[n]=a;
 
 }    public boolean equals(T a){
 return true;
}}class dp
{     int a=9;  }public class testq
{  
public static void main(String []args){
 dp o=new dp();
 pair<String >  dd=new pair<String>("eee");
 pair<String >   []  a=new pair[3] ;//     --------问题所在---------------
// pair<dp> ad=new pair<dp>(o);
// ad=(pair<dp>) dd;
a[0]=new pair("2");
a[1]=new pair(2);
dd.set(1,"dfsfsf");
a[1].set(1,2);
// pair<dp > [] a=new   pair<dp>[2];
 //a[0]=new pair<dp>(o);
/// a[1]=new pair<String>("哈珀");
//  if(ad instanceof pair)
  System.out.print( a[1].get(1)+dd.get(1));
}
}如上所示的一段代码  ,是对泛型的一种测试 书上说不能创建泛型数组,例如
pair<String>[] a=new pair<String>[2]//error
 书上的解释是类型擦除后  会成为pair  a=new pair[2];
接着会转换为object  [] obj=a;
那么obj[0]=pair<Integer>
obj[1]=pair<String>
这样就无法限制一个pair<String>数组中只存放pair<String>类型数据  
这段解释我看的实在有点迷糊 于是写了如上代码
其中 pair<String >   []  a=new pair[3]
那么很奇怪,看如下代码
a[0]=new pair("2");
a[1]=new pair(2);
他们已经存入了  Integer类型的pair   与String的pair
但是a[1].set(1,2)这句就发生错误了  说与pair<String>不匹配  那么 我的问题是pair<String >   []  a=new pair[3] 为什么不会出错,毕竟pair<String > 是pair的一个子类啊  那子类怎么能去引用父类呢 其次    存放数组的时候无法检测出来 但在运行时候就出问题了~~~~这是为什么

解决方案 »

  1.   

     pair<String >   []  a=new pair[3] ;//     --------问题所在---------------这个3是 数字的初始化大小System.out.println(a.length); 你就知道了
      

  2.   

    泛型还真的难以理解,但抛开泛型呢:pair<String > [] a=new pair[3] 为什么不会出错,毕竟pair<String > 是pair的一个子类啊 那子类怎么能去引用父类呢 ?
    pair<String >[] a=new pair[3]相当于pair<String >[] a = (pair<String >[])new pair[3];编译器会插入类型转换;其次 存放数组的时候无法检测出来 但在运行时候就出问题了?
    你都知道pair<String > 是pair的一个子类,pair<Integer>是pair的一个子类吧,但new的是pair[3]; 
    a[0] = new pair("2"); a[1] = new pair(2); 此处就是原型赋值,相当于a[1] = (pair<String>)((pair)new pair<Integer>(2)); 编译当然没问题,但a[1].set(1,2);就不同了,是把一个Integer转型为String,也即da[n]=a;这步会这样转String str = (String)a; 2是Integer啊;把pair<String >[] a=new pair[3]中的<String>去掉,让编译器根据传入的参数转吧。