黑马程序员技术交流社区

标题: 数组反射小疑问<编译时报错> [打印本页]

作者: 徐鑫    时间: 2012-4-21 01:54
标题: 数组反射小疑问<编译时报错>
本帖最后由 徐鑫 于 2012-4-21 21:53 编辑

请看代码注释部分            
我想问的是注释带?的地方,请看清问题,是编译报错,不是运行后结果!!!!
//数组与object的关系及其反射类型
        int [] a1 = new int[]{4,2};
        int [] a2 = new int[4];
        int [][]a3 = new int [2][3];
        String [] a4 = new String []{"e","a","g","d"};
        
        System.out.println(a1.getClass() == a2.getClass());//(int)类型相同,(一维数组)维度相同则数组的字节码相同
//        System.out.println(a1.getClass() == a3.getClass()); 这里编译不通过是因为多维数组没有字节码?
//        System.out.println(a1.getClass() == a4.getClass());为什么 编译不通过?
        System.out.println(a1.getClass().getSuperclass().getName());
如果是因为类型不同的话,他们不是class类型比较么?
作者: 毕博    时间: 2012-4-21 07:51
        System.out.println(a1.getClass() == a3.getClass());  class类的表现形式是字节码,二维int型和一维int型的字节码不同,直接在编译器就报错了
       System.out.println(a1.getClass() == a4.getClass());                                         一维int和一维string字节码也是不同的。如果换成int就true了
        System.out.println(a1.getClass().getSuperclass().getName());

作者: 朱鹏举    时间: 2012-4-21 09:39
老张讲课的时候是可以通过的,估计版本不同的问题,我使用1.7的话,也没有通过,编译器直接报错,
因为  System.out.println(a1.getClass() == a3.getClass()); 多维数组和一维数组字节码是不同的
System.out.println(a1.getClass() == a4.getClass());int数组和String数组的字节码也是不同的。

作者: 蒋亮    时间: 2012-4-21 10:47
System.out.println(a1.getClass() == a3.getClass()); 数组类型相同,但是维数不同,可以将a3看成元素内容为数组的一维数组,而a1的元素为int型基本数据的一维数组,他们的字节码肯定不同了。
System.out.println(a1.getClass() == a4.getClass());数组类型不同,字节码自然也不同了。
它们比较的是字节码
作者: 徐鑫    时间: 2012-4-21 11:27
你们回答的有点跑题了吧。。。我问的是为什么编译不过,你们回答的是运行之后是true还是false!我注释里写的是编译报错!!!!请大家看清问题!!!
1楼和2楼的回答重复了我的问题!他们都是class类型,字节码不同就直接报错???那字符串“abc”==“xyz”也会编译报错???肯定不会啊!难道是字节码比较特殊?
请求帮助{:soso_e132:}
作者: 徐鑫    时间: 2012-4-21 11:35
毕博 发表于 2012-4-21 07:51
System.out.println(a1.getClass() == a3.getClass());  class类的表现形式是字节码,二维int型和 ...

字节码不同就报错,那“abc”与“xyz”也不同,他们用==比较也报错?显然不是
作者: 罗旭维    时间: 2012-4-21 15:38
1.数组与object的关系,可以这么理解,就是所有数组都是类,而object是所有类的父类。任何数组对象都可以赋值给object对象。
2.编译通不过,这样改一下应该可以了:
       System.out.println(a1.getClass() == (Class)a3.getClass()); //这里编译不通过是因为多维数组没有字节码?
        System.out.println(a1.getClass() == (Class)a4.getClass());//为什么 编译不通过?
用(Class)强制类型转换。

本来逻辑上编译是没问题的,我认为是jdk版本的问题。1.5之后的都没通过,是因为范型的原因(个人的理解),我这样判断的依据是看jdk文档里Class的定义是:java.lang.Class<T>。经过测试发现这个(Class)强制转换只要加了就行,不论你加在哪个(a1或a3,a4)身上都行,估计是编译器如果知道这个是Class类的对象的操作估计会特别对待,这就解释了为什么加在谁身上都行了。
一开始编译通不过是因为把它当作了普通的范型对象的操作了,后来加了(Class),编译器一旦知道这些是与Class有关的操作就不会把它当作普通的范型对待了。

另外加一些个人对数组和范型的理解有助于支持我上面做出的分析:
数组:
开发人员要定义什么样的数组编译器不知道,所以每定义一个新数组(判断数组的不同是通过维度或元素类型),编译器会自动产生一个新的类。
范型:
范型的机制,编译器在遇到范型对象时是会用object类型替换,然后如果需要会把对象通过强制类型转换转换为对应的类。而且好像跟数组一样对于Class<T>这样的范型,对于不同的T可能(真的只是可能,如非必要相信编译器不对吃多了多产生一个类)也会产生新的类。

作者: 邵中国    时间: 2012-4-21 18:57
编译器(“==”是编译时期)可以查找冗余的代码,两个字节码不是可比类型,就报错了
作者: 邵中国    时间: 2012-4-21 18:59
徐鑫 发表于 2012-4-21 11:35
字节码不同就报错,那“abc”与“xyz”也不同,他们用==比较也报错?显然不是 ...

“abc”和“xyz”都是字符串,他们在内存中的字节码是一样的
作者: 徐鑫    时间: 2012-4-21 19:11
yuanshilieshou 发表于 2012-4-21 18:59
“abc”和“xyz”都是字符串,他们在内存中的字节码是一样的

字节码不就是Class类型么??难道他们还有String,Integer...这些类型?
作者: 邵中国    时间: 2012-4-21 21:47
都是Class,但数组和String有自己的字节码
作者: 徐鑫    时间: 2012-4-21 21:51
yuanshilieshou 发表于 2012-4-21 21:47
都是Class,但数组和String有自己的字节码

好的,我明白了,谢谢回答




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2