黑马程序员技术交流社区

标题: 学习数组反射时遇到的问题! [打印本页]

作者: L.I.F.E    时间: 2013-6-14 19:39
标题: 学习数组反射时遇到的问题!
本帖最后由 L.I.F.E 于 2013-6-15 07:27 编辑
  1. int[] a1 = new int[3];
  2.                 int[] a2 = new int[4];
  3.                 int[][] a3 = new int[2][3];
  4.                 String[] a4 = new String[3];

  5.                 System.out.println(a1.getClass() == a2.getClass());
  6.                 System.out.println(a1);
  7.                 System.out.println(a1.getClass());
  8.                 System.out.println(a3.getClass());
  9.                 //System.out.println(a1.getClass() == a3.getClass());
  10.                 System.out.println(a1.getClass().getName());

  11.                 System.out.println(a1.getClass().getSuperclass().getName());
复制代码
第十行运行不过?我看视频中用myeclipse 编译为false。
我分别打印了a1.getClass()和a2.getClass(),

11.png (4.22 KB, 下载次数: 0)

报错信息

报错信息

222.png (1.04 KB, 下载次数: 0)

数组的字节码是class[I??

数组的字节码是class[I??

作者: 苑永志    时间: 2013-6-14 21:35
a1.getClass() == a3.getClass()编译报错的缘故是==操作符的操作数a1.getClass()和a3.getClass()是不同类型的操作数,

楼主可能会想,分明都是Class类型的实例呀,怎么会不兼容呢,根据提示我们也可以看到两者是带有泛型的Class类型数据,分别是Class<int[]>和Class<int[][]>。

在jdk1.5之后带有不同泛型类型的同一类数据被视为不兼容的内容,以上的例子便是如此。实际上a1.getClass()和a3.getClass()仍然是可以比较的,因为两者都是代表内存中的一段字节码。怎么办呢?改成(Object)a1.getClass() == (Object)a3.getClass()就可以通过编译了;还有一种做法是将编译器的编译级别(Compiler compliance level)改成jdk1.4,这样就能通过编译了,因为泛型是jdk1.5版本的新特性,1.4是没有泛型的,所以两者都是相同的Class类型
作者: L.I.F.E    时间: 2013-6-15 07:26
苑永志 发表于 2013-6-14 21:35
a1.getClass() == a3.getClass()编译报错的缘故是==操作符的操作数a1.getClass()和a3.getClass()是不同类型 ...

谢谢 明白了




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