黑马程序员技术交流社区
标题:
int.class==String.class判断结果问题?
[打印本页]
作者:
高鑫
时间:
2012-7-28 02:44
标题:
int.class==String.class判断结果问题?
import java.lang.reflect.*;
class ReflectDemo1
{
public static void main(String args[])throws Exception
{
ReflectPoint pt1=new ReflectPoint(3,5);
Field []fields=pt1.getClass().getFields();
for(Field f : fields)
{
if(f.getType()==String.class)
{
String s=(String)f.get(pt1);
String s1=s.replace("b","a");
f.set(pt1,s1);
}
}
System.out.println(pt1.toString());
}
}
class ReflectPoint
{
private int x;
public int y;
public String str1="ball";
public String str2="basketball";
public String str3="itcast";
public ReflectPoint(int x,int y)
{
super();
this.x=x;
this.y=y;
}
public String toString()
{
return str1+":"+str2+":"+str3;
}
}
复制代码
请问:在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
int.class==String.class和5==“hello”,有什么不懂的,只有当String.class==String.class时才可以比较
而下面是变化的过程,虚拟机需要比较才知道是相等还是不等Object[] objs ={String.class,Integer.class};
for(Object obj2:objs){
if(obj2==String.class){
System.out.println(obj2);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2