2016-11-21 8 views
0

java.util.concurrent.AbstractExecutorService에서 파생되는 클래스가 있습니다. 내 클래스는 shutdownNow()을 무시합니다. 모든 것이 잘 컴파일되고 실행됩니다.@NonNullByDefault 반환 유형이 ExecutorService.shutdownNow()에서 반환 된 'List <Runnable>'(호환되지 않는 null 제약 조건)과 호환되지 않습니다.

클래스에 [email protected]을 추가했습니다. shutdownNow()에서 1 오류를 제외한 모든 오류 및 경고를 해결할 수있었습니다. 오류 메시지가 반환 형식은()

빠른 수정이 도움이되지 않습니다 (NULL 제약 조건을 일치하지) ExecutorService.shutdownNow에서 반환 '목록'과 호환되지 않는

... 말한다.

다음은 문제가되는 코드입니다.

@NonNullByDefault // Adding this causes an error 
public abstract class ShutdownThreadPool extends AbstractExecutorService implements ExecutorService 
{ 
    @Override 
    public List<Runnable> shutdownNow() // The error is on this line 
    { 
     return(Collections.emptyList()); 
    } 
} 

참고 : Collections.emptyList()는 문제가되지 않습니다. 동일한 오류 메시지를 재생하는 것은 실제 코드를 단순화 한 것입니다.

다음은 코드 이미지입니다.

enter image description here

답변

1

ExecutorService 오른쪽 어떤 @NonNullByDefault의 범위에 포함되지 것 같다?

ExecutorServiceList<Runnable> shutdownNow()을 선언합니다.

그러나 재정의는 @NonNullByDefault의 유효 서명 @NonNull List<@NonNull Runnable> shutdownNow()의 영향을받습니다.

우리는 ExecutorService.shutdownNow()의 의도 된 의미를 모르는 :

는 불행하게도, 빠른 수정은 유형 인수 Runnable에 주석 반면 실제로 비 호환성 문제를 일으키는 첫 번째 @NonNull에 관하여 클라이언트는 널 (NULL) 또는 널 (null)이 아닌 기대한다 반환 된 목록의 요소? List<@NonNull Runnable>을 가정하면 null을 결과 목록에 삽입하려는 () 잠재적 인 발신자를 차단할 수 있습니다 (이상한 디자인은 무시할 수 있음).

이 오버라이드 유형을 안전하게 만들려면 우선 슈퍼 인터페이스 (이 경우 외부 주석 사용)에 null 주석을 도입하고 구현을 따라야합니다.

슈퍼 주석 것이 요구되는 "기존"유형 List<Runnable> 계속, 즉, 어떤 이유로 가능한 아닌 경우, 널의 기본은 어디 @NonNull를 추가 수동 @NonNullByDefault({}) 말을하고하여 하나의 방법에 대해 취소 할 수 있습니다 여전히 원하는.