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);却不行??

解决方案 »

  1.   

    a 是why类的一个实例,但并不是内部类Inner的实例
      

  2.   

    我的意思是 通过表达式判断(a instanceof Inner)返回一个布尔变量,难道一定要知道a是Inner的变量才行?那还有必要判断吗?
      

  3.   

    instanceof  != castof
    从字面上也可以理解为  instance of xxx  就是xxx的实现why 跟 why.Inner  根本没有继承上的关系  所以不能这么用noyes = (Object)a instanceof Inner;
    这样就可以用
      

  4.   

    在编译的时候,instanceof 会检查左边的Reference Variable Type跟右边的Type是否处于同一个Inheritence Hierarchy。很明显,a的Type是why,跟Inner不在同一个Hierarchy。
      

  5.   

    noyes = (Object)a instanceof Inner;造型成OBJECT果然可以!!但是不知道为什么要这样造型???不明白``
      

  6.   

    instanceOf两边的数据类型应该是一样的  不一样当然会报错
    但为什么(Object)a instanceof Inner就行  嗯  不明白  Inner难道也是Object型?
      

  7.   

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

  8.   

    刚好在看这篇文章,推荐给你,希望对你有所触发.
      
        http://dev.csdn.net/author/axman/3bac371ded184fe989012a8167667ae0.html