带有泛型外类的“instanceof”问题

时间:2011-07-27 18:48:34

标签: java generics inner-classes

以下代码无法编译:

class OuterClass<T> {

    class BaseClass { }

    class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof SubClass);
    }
}

方法test()上的错误消息是:“无法对参数化类型MyOuterClass.MySubClass执行instanceof检查。请使用表单MySubClass,因为在运行时将删除其他泛型类型信息

那么如何确定变量是否为BaseClass类型?我已经尝试了以下所有内容但它们不起作用:

boolean b1 = (myObject instanceof SubClass);
boolean b2 = (myObject instanceof SubClass<T>);
boolean b3 = (myObject instanceof SubClass<?>);
boolean b4 = (myObject instanceof OuterClass.SubClass);
boolean b5 = (myObject instanceof OuterClass<T>.SubClass);
boolean b6 = (myObject instanceof OuterClass<?>.SubClass);
boolean b7 = (myObject instanceof OuterClass.SubClass<T>);
boolean b8 = (myObject instanceof OuterClass.SubClass<?>);

我认为这个问题与JVM版本无关,但为了以防万一,我使用的是Sun的1.6.0_22-b04版本。

4 个答案:

答案 0 :(得分:2)

这只是部分答案,但如果我们按如下方式修改示例,它会编译:

class OuterClass<T> {

    class InnerClass { }

    public void test(Object myObject) {
        boolean b1 = (myObject instanceof OuterClass.InnerClass);     // Works
        boolean b2 = (myObject instanceof OuterClass<?>.InnerClass);  // Also works
    }
}

答案 1 :(得分:1)

您的b4代码是正确的。至少为1.6.0_23。

class OuterClass<T> {

    class BaseClass { }

    class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof OuterClass.SubClass);
        System.out.println(b);
    }

    public static void main(String[] args) {
        OuterClass<Integer> outerClass = new OuterClass<Integer>();
        OuterClass<Integer>.BaseClass b = outerClass.new BaseClass();
        OuterClass<Integer>.SubClass s = outerClass.new SubClass();
        outerClass.test(b);
        outerClass.test(s);
    }
}

输出:

false
true

Java版:

java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)

答案 2 :(得分:1)

回想起追逐与命名的非静态内部类相关的细微错误的痛苦经历,我无法抗拒地看到如果我让它们变得静止会发生什么......

class OuterClass<T> {

    static class BaseClass { }

    static class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof SubClass);
    }
}

......瞧!编译器错误随风而去

答案 3 :(得分:0)

感谢高度咖啡因和Nulldevice指出b4和b6是正确的。

我发现这是我正在使用的Eclipse版本中的一个错误。 (我使用的是Ganymede,当我升级到Helios时它已经修复了。)

仅供记录,我已将其归档为Eclipse bug 353354