2014-03-28 4 views
3

경고Findbugs BC_UNCONFIRMED_CAST 나는 두 개의 클래스가

A a = new B(); 
if(a instanceof B){ 
    doSomething((B) a); // type case a to B 
} 

해봐요 방법은 다음과 같습니다 -

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를 발생시킵니다. 나는 두 가지 구현 모두에서 많은 차이점을 보지 못했다. 어떤 제안이라도 나는 무엇이라도 놓치고 있냐?

+0

if (a.isOfTypeB()) 또는 doSomething ((B) a)에 줄에 오류가 있습니까? – algorithmic

+0

doSomething ((B) a) 행에 발생합니다. 질문 – Kevindra

+0

업데이트 findbug가 메소드 호출 isOfTypeB가 instanceof 검사인지 확인하는 것이 불가능할 수도 있습니다. – algorithmic

답변

6

FindBugs는 instanceofcheckcast 바이트 코드보다 먼저 찾습니다. assert을 사용하면 FindBugs 경고 및 향후 코드 관리자를 기쁘게 할 수 있습니다.

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가 코드 및 광산 기능의 예를 모두 예상대로 감지하지 못하는 경우에도이 작업을 수행하지 않는 것이 좋습니다.

1

ServletResponse에서 HttpServletResponse로 변환하려는 사용자는 다음과 같이 instanceof을 사용하십시오.

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {  

     if (response instanceof HttpServletResponse) 
      noCaching((HttpServletResponse) response); 

     chain.doFilter(request, response); 
    } 

BC_UNCONFIRMED_CAST findbugs report에 BC_UNCONFIRMED_CAST 버그가보고되지 않습니다.