黑马程序员技术交流社区

标题: int.class==String.class判断结果问题? [打印本页]

作者: 高鑫    时间: 2012-7-28 02:44
标题: int.class==String.class判断结果问题?
  1. import java.lang.reflect.*;

  2. class ReflectDemo1
  3. {
  4.         public static void main(String args[])throws Exception
  5.         {
  6.             ReflectPoint pt1=new ReflectPoint(3,5);
  7.             Field []fields=pt1.getClass().getFields();
  8.             for(Field f : fields)
  9.             {
  10.                     if(f.getType()==String.class)
  11.                     {
  12.                             String s=(String)f.get(pt1);
  13.                             String s1=s.replace("b","a");
  14.                             f.set(pt1,s1);
  15.                            
  16.                     }       
  17.             }
  18.             System.out.println(pt1.toString());
  19.         }
  20. }
  21. class ReflectPoint
  22. {
  23.         private int x;
  24.         public int y;
  25.         public String str1="ball";
  26.         public String str2="basketball";
  27.         public String str3="itcast";
  28.         public ReflectPoint(int x,int y)
  29.         {
  30.                 super();
  31.                 this.x=x;
  32.                 this.y=y;
  33.         }       
  34.         public String toString()
  35.         {
  36.                 return str1+":"+str2+":"+str3;
  37.         }
  38. }


复制代码
请问:在for循环中会遍历所有的fields数组中的内容,因为x和y是int型的,所以if(f.getType()==String.class)
这一句也会判断if(int.class==String.class),请问如果我们单独搞段代码System.out.println(int.class==String.class)显示判断结果,会报错“不可比较的类型"。为什么这里遍历到的int.class就可以和String.class比较呢??
作者: fiend    时间: 2012-7-28 07:44
ReflectPoint pt1=new ReflectPoint(3,5);
Field []fields=pt1.getClass().getFields();
for(Field f : fields)
因为pt1对象的字段有可能是有String类型的,所以这里是不确定f的类型的,所以编译器在编译的时候并不能检查出f的具体类型,
所以if(f.getType() == String.class)是可以的。
而你说的System.out.println(int.class==String.class)已经很明显的说明了它们一个是int型一个是String类型的,编译器在编译
的时候检查的时候就可以检查出来了,所以会提示错误。


作者: 吴立杰    时间: 2012-7-28 07:53
int.class和String.class是绝对不等的,所以编译器直接报错吧,那个变量是相对有可能出现相等的,有个判断过程,所以不会报错,这么理解就行了
作者: 高鑫    时间: 2012-7-28 19:33
还有更好的答案吗
作者: 吴立杰    时间: 2012-7-28 20:45
  1. int.class==String.class和5==“hello”,有什么不懂的,只有当String.class==String.class时才可以比较
  2. 而下面是变化的过程,虚拟机需要比较才知道是相等还是不等Object[] objs ={String.class,Integer.class};
  3.                                 for(Object obj2:objs){
  4.                                         if(obj2==String.class){
  5.                                                 System.out.println(obj2);
  6.                                         }
  7.                                 }
复制代码





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