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); 此时比较的是变量c1和c2是否指向同一份字节码,比较的是c1和c2指向的地址,因为在内存中一个类的字节码文件只有一份,不会重复加载,所以可以通过比较引用变量指向的地址来得出结论。
我觉得他们答的不完整,因为没说出为什么编译错误,只说出了解决方案?我个人认为这个编译错误肯定跟泛型有关?但是当时还找不出原因,今天复习了泛型,有了个想法,然后进行实验证明果然是这样的错误?
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);。
|