黑马程序员技术交流社区

标题: 关于Class的比较问题(郁闷之 急~急~急~) [打印本页]

作者: 孔肖    时间: 2012-8-8 09:19
标题: 关于Class的比较问题(郁闷之 急~急~急~)
int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[3];
  
对于a1和a2的比较可以直接用输出语句得到结果
System.out.println(a1.getClass() == a2.getClass());

而对于a1和a3、a4的比较,直接用输出语句比较却会在编译时期就报错呢?
System.out.println(a1.getClass() == a3.getClass());
System.out.println(a1.getClass() == a4.getClass());

但是,如果先把Class表示出来再比较就又没问题了。。。
Class c1 = a1.getClass();
Class c3 = a3.getClass();
Class c4 = a4.getClass();
System.out.println(c1 == c3);
System.out.println(c1 == c4);


这是问什么呢?看张老师的视频就没有这样的问题,可以直接用输出语句得出结果。。。求解。。。

作者: 周世阳    时间: 2012-8-8 10:35
本帖最后由 周世阳 于 2012-8-8 10:37 编辑

a1.getClass() == a3.getClass()报错是因为他们的参数化类型不兼容
如果先
Class c1 = a1.getClass();
Class c3 = a3.getClass();
然后
System.out.println(c1 == c3); 就不会报错
这是因为a1和a3虽然参数化类型且不兼容,但是在赋值的过程中给了原始类型Class c1,和Class c2,泛型只存在于编译期,而编译器只会逐行扫描,
当扫描到System.out.println(c1 == c3);时,因为c1和c2都是原始类型,所不不存在兼容问题,自然不会报错
视频种有个例子:
如果Vector<Object> v1 = new Vector<String>()编译无法通过
而Vector v1 = new Vector<String>();
                Vector<Object> v = v1;
则可以通过,也是这个原因。


作者: hello world    时间: 2012-8-8 11:11
我觉得这个可以很好的帮助你了,我自己刚看你的问题是  也是觉得挺有意思的  自己就试了试  也总结了些  不对请指出  共同进步
public class MyTest {

public static void main(String[] args) {
  int[] a1 = new int[3];
  int[] a2 = new int[4];
  int[][] a3 = new int[2][3];
  String[] a4 = new String[3];
   
  //对于a1和a2的比较可以直接用输出语句得到结果
  System.out.println(a1.getClass() == a2.getClass()); //两个没有关心的类型    就不能比较了
  
  System.out.println(a1.getClass());//class [I        
  System.out.println(a2.getClass());//class [I
  System.out.println(a3.getClass());//class [[I
  System.out.println(a4.getClass());//class [Ljava.lang.String;
  
  System.out.println((Class)a1.getClass() == a2.getClass());//自动类型提升进行比较
  System.out.println((Class)a1.getClass() == (Class)a2.getClass());
  //而对于a1和a3、a4的比较,直接用输出语句比较却会在编译时期就报错呢?
  //System.out.println(a1.getClass() == a3.getClass());       这样子比较编译报错是因为两个不同类型不能进行比较
  //System.out.println(a1.getClass() == a4.getClass());       class [I  ==  class [[I    class [I  ==  class [Ljava.lang.String
  //但是,如果先把Class表示出来再比较就又没问题了。。。
  Class c1 = (Class)a1.getClass();//这样子比较没问题  是因为所有类的父类是Class  自动向上转型后  类型都是父类型Class
          //同种类型比较就没问题了。
  Class c3 = a3.getClass();
  Class c4 = a4.getClass();
  System.out.println(c1 == c3);
  System.out.println(c1 == c4);
  
  //例子有助于你理解
  Student st = new Student();
  Teacher th = new Teacher();
  //System.out.println(st==th);  不同的类型不能进行比较,编译编译报错
  Person pst = new Student();
  Person pth = new Teacher();
  System.out.println(pst==pth);
  System.out.println(pst==st);  //这个还真是有趣  这样子也能比   父类和子类也能比   个人总结是因为有关系的才能进行比较  两个无关系的类不能进行比较
  System.out.println(pst==th);  //父类和子类进行比较时还会向上转型
  
}

}
class Person {
  
}
class Student extends Person {

}
class Teacher extends Person {

}

作者: 刘渝灵    时间: 2012-8-8 21:51
楼上的厉害。




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