黑马程序员技术交流社区
标题:
张老师说想得头疼的问题:数组里面可以放泛型类型吗?
[打印本页]
作者:
王杰
时间:
2012-4-28 23:54
标题:
张老师说想得头疼的问题:数组里面可以放泛型类型吗?
本帖最后由 王杰 于 2012-4-29 00:27 编辑
/*张老师的高新技术里,有一段关于泛型类型不能放在数组里的说法。
* 下面的代码在编译时就报错:
ArrayList<String>[] al = new ArrayList<String>()[10];
error:The type of the expression must be an array type but it resolved to ArrayList<String>
说表达式的类型必须是一个数组类型。
所以改写为张老师的写法:
ArrayList<String>[] al = new ArrayList<String>[10];
error:Cannot create a generic array of ArrayList<String>
*/
// 但是我发现其实数组里面是可以放泛型类的,比如下面这段代码:
ArrayList<String> al2[] = new ArrayList[2];
ArrayList<String>[] genericArrs = al2;
ArrayList<String> sub1 = new ArrayList<String>();
sub1.add("Generic");
sub1.add("Type");
ArrayList<String> sub2 = new ArrayList<String>();
sub2.add("abc");
sub2.add("def");
al2[0] = sub1;
al2[1] = sub2;
for (ArrayList<String> genericArr : genericArrs) {
System.out.println(genericArr);
}
/*
* 可以看出,下面这种做法就是利用中介量al2把第一种写法拆成了两块,
* 我们知道编译器报错是因为语法有错,那么我们可以大胆猜想:
* 其实,在数组中是可以存放泛型类型的,但是如果用一句代码来声明的话,
* 会出现语法错误!
* 我们知道,每一种高级语言在编译阶段会通过本身的语法规则,将高级语言翻译成汇编语言
* 或者机器语言,然后才可以执行。java也是这样的,
* 那么是不是因为第一种写法:ArrayList<String>[] al = new ArrayList<String>[10];
* 的某个地方不符合语法规则,所以编译器报错。就像我开始写的那样,尖括号后面圆括号,圆括号后面方括号:
*ArrayList<String>[] al = new ArrayList<String>()[10];
* 自己推论的。说错了不要笑,呵呵,不知道你们是怎么理解的。*/
复制代码
作者:
毕博
时间:
2012-4-29 16:10
是的,我也做过类似实验,有时候把一句话变成两句话就能躲过编译检查。
举个简单的例子
while(true)
{sys("来点数据");
}
if();//或者换点别的代码都不行,编译器会认为执行不到这里。
//但是如果把while里的true换成一个变量t,在上边加上boolean t =true;就没有报错了。
呵呵,小实验,应该一个道理
作者:
王杰
时间:
2012-4-29 20:43
毕博 发表于 2012-4-29 16:10
是的,我也做过类似实验,有时候把一句话变成两句话就能躲过编译检查。
举个简单的例子
while(true)
嗯嗯 对呀
作者:
王杰
时间:
2012-4-29 20:48
突然发现自己错了!!!!!!!!
其实我并没有将参数化的泛型建立数组,
ArrayList<String> al2[] = new ArrayList[2];
最后编译器会处理为原始类型ArrayList,忽略String。
ArrayList<String>[] genericArrs = al2;
同理al2 在上一次编译时已经被认为是原始类型了,所以这儿也会忽略<String>,将genericArrs认为成是原始类型。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2