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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© L.I.F.E 中级黑马   /  2013-6-14 19:39  /  1998 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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??

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

2 个回复

倒序浏览
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类型

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

回复 使用道具 举报
苑永志 发表于 2013-6-14 21:35
a1.getClass() == a3.getClass()编译报错的缘故是==操作符的操作数a1.getClass()和a3.getClass()是不同类型 ...

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