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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

System.out.println(int.class==char.class);
为什么这个会编译错误,视频上没错啊,难道是版本问题?
下面上次问这个问题时几个同学的回答:
类型不同,无法比较incomparable types: java.lang.Class<java.lang.Integer> and java.lang.Class<java.lang.Character>
如果你想要比较字节码文件是否是同一份,可以这样写
Class c1=int.class;
Class c2=char.class;
System.out.println(c1==c2);
也可以这样写System.out.println((Class)int.class == (Class)char.class);
此时比较的是变量c1c2是否指向同一份字节码,比较的是c1c2指向的地址,因为在内存中一个类的字节码文件只有一份,不会重复加载,所以可以通过比较引用变量指向的地址来得出结论。

我觉得他们答的不完整,因为没说出为什么编译错误,只说出了解决方案?我个人认为这个编译错误肯定跟泛型有关?但是当时还找不出原因,今天复习了泛型,有了个想法,然后进行实验证明果然是这样的错误?
Class<Integer> c1=int.class;
Class<Character> c2=char.class;
System.out.println(c1==c2);(提示incomparable types: java.lang.Class<java.lang.Integer> and java.lang.Class<java.lang.Character>

System.out.println(int.class==char.class);(incomparable types: java.lang.Class<java.lang.Integer> and java.lang.Class<java.lang.Character>)这个错误提示与上面的一模一样,

说明int.class==char.class系统编译时自动加上了泛型变成了(Class<Integer>)int.class==(Class<Character>)char.class所以编译就通不过了。
所以需要强制不使用泛型或者强制使用同一类的泛型,但是他们编译结果不是同一个类型,所以也可以用通配符?定义泛型。
所以这样写也是可以编译通过的
System.out.println((Class<Integer>)int.class==(Class<?>)char.class);。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马