1

这里我有点好奇:

if (!(Outer instanceof Outer.Nested))
{
    System.out.println("IT IS NOT THE SAME!!");
}

为什么编译器不理解Outer.Nested不扩展Outer也不能成为它的实例,因此返回编译错误?

请注意,如果反过来:Outer.Nested instanceof Outer它将不起作用。

4

2 回答 2

1

JLS 15.20.2 开始

RelationalExpression:
    ....
    RelationalExpression instanceof ReferenceType

instanceof运算符的RelationalExpression操作数的类型必须是引用类型或者null类型;否则,会发生编译时错误。

换句话说,instanceof 的左侧必须是对某个对象或的引用nullOuter看起来像一个类名,这两者都不是。

您可能正在寻找Class.isAssignableFrom(),它告诉您一个类是否是另一个类的超类。

于 2013-06-23T14:57:21.553 回答
1

首先,该语句无法编译,如果Outer是类类型:

if (!(Outer instanceof Outer.Nested))  // Outer is not an expression: Expression expected

如果问题中没有准确的上下文,我想你会处理这样的场景:

public class Outer {

        private class Inner {
        }

        public static void main(String[] args) {
            Test t = new Test();
            Inner i = t.new Inner();
            System.out.println(i instanceof Test);  //inconvertible types => normal
            System.out.println(t instanceof Inner); // inconvertible types => normal
        }

    }

一切都是这样正常发生的。

如果您的情况相似:听起来像是您的编译器进程的问题。

如果您的情况不相似:请使用更多信息更新您的问题。

于 2013-06-23T14:46:39.617 回答