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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王杰 于 2012-4-29 00:27 编辑
  1. /*张老师的高新技术里,有一段关于泛型类型不能放在数组里的说法。
  2.                  * 下面的代码在编译时就报错:
  3.                 ArrayList<String>[] al  = new ArrayList<String>()[10];
  4.                 error:The type of the expression must be an array type but it resolved to ArrayList<String>
  5.                 说表达式的类型必须是一个数组类型。
  6.                 所以改写为张老师的写法:
  7.                 ArrayList<String>[] al  = new ArrayList<String>[10];
  8.                 error:Cannot create a generic array of ArrayList<String>
  9.                 */
  10. //                但是我发现其实数组里面是可以放泛型类的,比如下面这段代码:
  11.                 ArrayList<String> al2[] = new ArrayList[2];
  12.                 ArrayList<String>[] genericArrs = al2;

  13.                 ArrayList<String> sub1 = new ArrayList<String>();
  14.                 sub1.add("Generic");
  15.                 sub1.add("Type");

  16.                 ArrayList<String> sub2 = new ArrayList<String>();
  17.                 sub2.add("abc");
  18.                 sub2.add("def");
  19.                
  20.                 al2[0] = sub1;
  21.                 al2[1] = sub2;
  22.                
  23.                 for (ArrayList<String> genericArr : genericArrs) {
  24.                         System.out.println(genericArr);
  25.                 }
  26.                 /*
  27.                  * 可以看出,下面这种做法就是利用中介量al2把第一种写法拆成了两块,
  28.                  * 我们知道编译器报错是因为语法有错,那么我们可以大胆猜想:
  29.                  * 其实,在数组中是可以存放泛型类型的,但是如果用一句代码来声明的话,
  30.                  * 会出现语法错误!
  31.                  * 我们知道,每一种高级语言在编译阶段会通过本身的语法规则,将高级语言翻译成汇编语言
  32.                  * 或者机器语言,然后才可以执行。java也是这样的,
  33.                  * 那么是不是因为第一种写法:ArrayList<String>[] al  = new ArrayList<String>[10];
  34.                  * 的某个地方不符合语法规则,所以编译器报错。就像我开始写的那样,尖括号后面圆括号,圆括号后面方括号:
  35.                  *ArrayList<String>[] al  = new ArrayList<String>()[10];
  36.                  * 自己推论的。说错了不要笑,呵呵,不知道你们是怎么理解的。*/
复制代码

3 个回复

倒序浏览
是的,我也做过类似实验,有时候把一句话变成两句话就能躲过编译检查。
举个简单的例子
while(true)
{sys("来点数据");
}
if();//或者换点别的代码都不行,编译器会认为执行不到这里。
     //但是如果把while里的true换成一个变量t,在上边加上boolean t =true;就没有报错了。
     呵呵,小实验,应该一个道理

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
毕博 发表于 2012-4-29 16:10
是的,我也做过类似实验,有时候把一句话变成两句话就能躲过编译检查。
举个简单的例子
while(true)

嗯嗯 对呀
回复 使用道具 举报
突然发现自己错了!!!!!!!!
其实我并没有将参数化的泛型建立数组,

ArrayList<String> al2[] = new ArrayList[2];
最后编译器会处理为原始类型ArrayList,忽略String。
ArrayList<String>[] genericArrs = al2;
同理al2 在上一次编译时已经被认为是原始类型了,所以这儿也会忽略<String>,将genericArrs认为成是原始类型。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马