gpt4 book ai didi

java - Findbugs BC_UNCONFIRMED_CAST 警告

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:23 25 4
gpt4 key购买 nike

我有两个类(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 查找 instanceofcheckcast 之前字节码。您可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com