以下代码无法编译:
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版本。
答案 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。