【发布时间】:2014-03-28 20:09:06
【问题描述】:
我有两门课 -
class A {}
class B extends A {}
而我正在这样做 -
A a = new B();
if(a instanceof B){
doSomething((B) a); // type case a to B
}
doSomething 方法看起来像这样 -
public void doSomething(B b) { .. }
Findbugs 在上述代码中没有发出警告。但是如果我像这样更改上面的代码 -
class A {
public boolean isOfTypeB() {
return this instanceof B;
}
}
class B extends A {}
A a = new B();
if(a.isOfTypeB()){
doSomething((B) a); // BC_UNCONFIRMED_CAST warning
}
Findbugs 引发错误 BC_UNCONFIRMED_CAST。我认为这两种实现方式没有太大区别。有什么建议吗,我有什么遗漏吗?
【问题讨论】:
-
错误是在 if(a.isOfTypeB()) 行还是在 doSomething((B) a) 上引发的?
-
它是在 doSomething((B) a) 行上提出的。更新了问题
-
很可能是findbug无法判断方法调用isOfTypeB是instanceof检查。
-
是的,findbugs 似乎不支持它 - osdir.com/ml/java.findbugs.general/2006-12/msg00014.html
-
警告在 this 的情况下是正确的,因为
isOfTypeB()不是final。可以用例如覆盖它return true;.