日期:2014-05-20  浏览次数:20721 次

instanceof的问题!!!急`
public   class   why   {
public   boolean   ok(Object   o){
if(o   instanceof   Inner){
return   true;
        }else   {return   false;}
  }
class   Inner{
}
public   static   void   main(String   []args){
why   a   =   new   why();
why   b   =   new   why();
why.Inner   in   =a.new   Inner();
boolean   yesorno;
boolean   noyes;
//编译能通过
yesorno   =   (in   instanceof   Inner);
                //编译不能通过(条件操作数类型   why   和   why.Inner   不兼容)
//通过表达式判断a是不是Inner的类的实例,编译不能通过
      noyes   =   (a   instanceof   Inner);
      //通过调用ok方法判断a是不是Inner类的实例,编译通过
b.ok(a);
}
}
为什么表达式中直接返回BOOLEAN类型yesorno   =   (in   instanceof   Inner);可以
而noyes   =   (a   instanceof   Inner);却不行??

------解决方案--------------------
instanceof在下列几种情况下会发生编译时错误:
1.instanceof左边的变量必须是一个引用类型或null类型(null类型只有null一个可用值)。
2.instanceof左边的变量必须是编译时确定的类型。
3.如果从instanceof左边的变量到右边的类型转换由于编译错误而拒绝,那么instanceof的使用将引起编译错误。因为这种情况下,instanceof表达式总不可能是true。

instanceof的结果只有在左边的变量不是null并且该引用能转换成右边的类型而不引起ClassCastException异常的情况下才为true,否则为false.