作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个类(class) -
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。我没有看到这两种实现有太大区别。任何建议,我错过了什么吗?
最佳答案
FindBugs 查找 instanceof
在 checkcast
之前字节码。您可以使用 assert
取悦 FindBugs 警告和您代码的 future 维护者。
A a = new B();
if (a.isOfTypeB()){
assert a instanceof B : a.getClass(); //Safe to call getClass because 'a' is non-null.
doSomething((B) a);
}
在 FindBugs 3.0 之前,您可以使用动态转换来解决此警告。不要这样做,因为它会在更高版本的 FindBugs 中检测到。
A a = new B();
if (a.isOfTypeB()) {
doSomething(B.class.cast(a));
}
<罢工>
要考虑的一件事是,FindBugs 检测确实会产生实际错误的模式和可以产生实际错误的模式。无法覆盖“instanceof”关键字和 Class.cast 行为,但可以覆盖“isTypeOfB”。即使 FindBugs 没有检测到您的代码示例和我的代码示例都按预期运行,警告也可能是正确的,因为建议不要这样做。
关于java - Findbugs BC_UNCONFIRMED_CAST 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722281/
我有两个类(class) - class A {} class B extends A {} 我正在做这个 - A a = new B(); if(a instanceof B){ doSome
我是一名优秀的程序员,十分优秀!