2009-07-31 3 views
12

다음과 같은 간단한 인터페이스 상속 계층을 고려하십시오.Java : 사용되지 않는 멤버를 무시하는 파생 인터페이스에서 더 이상 사용되지 않는 경고를 피하는 방법?

// Starting point: 
public interface Base { 
    void Foo(); 
} 

public interface Derived extends Base { 
} 

Base 메소드를 Base 인터페이스에서 Derived 인터페이스로 이동하기위한 것입니다.

// Desired end-point: 
public interface Base { 
} 

public interface Derived extends Base { 
    void Foo(); 
} 

이 변경을 단계적으로 수행하기 위해 Base 인터페이스의 하위 호환성을 유지하는 것이 바람직합니다. 이 코드를 컴파일하면 Derived에 대한 컴파일러 경고가 나타납니다.

[deprecation]이 코드를 컴파일하면 다음과 같은 오류 메시지가 나타납니다. [] 이상하게도 Base의 설명서에서 @deprecated를 제거했지만 (@Deprecated로 남겨두면)이 경고가 사라집니다.

이 경고를받는 것이 맞습니까? 그렇다면 어떻게 해결할 수 있습니까?


이 경고는 Derived.Foo이 "사용"Base.Foo (더 이상 사용되지 않음)임을 알리는 것으로 보입니다. 그러나 Derived.Foo가 비추천 Base.Foo을 "사용"하는 유일한 용량은 그것을 오버라이드하는 것입니다. 파생 된 메소드에서 비추천 인터페이스 메소드를 대체 할 수 없다는 말이 있습니다.

이 경우, 경고를 표시하지 않으려면 @SuppressWarnings("deprecation")@SuppressWarnings("deprecation")로 장식해야합니까?

+0

어떤 Java 버전을 사용하고 있습니까? 나는 이것이 어떤 시점에서 버그로 여겨졌는지, 아마도 고정되어 있다고 생각한 것 같다. 그러나 나는 이것을 정확하게 기억할 수 없다. 나는 네가 의미하는 것을 정확히 보았다. –

답변

9

귀하의 요구 사항이 유효하다고 생각합니다. 더 이상 사용되지 않는 방법을 재정의하는 것이 올바른 방법입니다.

@deprecated와 @Deprecated의 차이점은 주로 역사적인 것입니다. @Deprecated는 java 5의 공식적인 방법이지만 새로운 것이므로 @deprecated를 사용하여 double을 사용할 것으로 예상됩니다.

슬프게도 @Deprecated는 정보를 지정하지 못하게하는데, 예를 들어 무엇이 대체품으로 사용해야하는지 또는 사용되지 않는 방법이 완전히 예상되는 경우 제거되었습니다.

슈퍼 메소드를 효과적으로 제거하자마자 문제를 알면 더 이상 알 수 없으므로 후임자가 이해할 수있는 주석과 함께 @SuppressWarnings ("deprecation")을 사용합니다. 메소드를 삭제할 때 모두 제거하도록 super 메소드에 대한 또 다른 주석).;-)

2

제대로 이해했다면 지원되지 않는 인터페이스/기능을 구현하는 클래스 시작 부분에 @SuppressWarnings ("deprecation")이 필요합니다. 또는 나는 여기에서 기초로부터 떨어져서 길이다?

+0

그럴만한 이유가 있지만, 여기서 문제는 구현 클래스가 없다는 것입니다. 두 인터페이스 만. 이 경고는'Derived.Foo'가'Base.Foo'를 사용하고 있다는 것을 전달하는 것 같습니다 (더 이상 사용되지 않습니다). 그러나'Derived.Foo'가 더 이상 사용되지 않는'Base.Foo'를 "사용"하는 유일한 능력은 그것을 오버라이드하는 것입니다. 파생 된 메소드에서 비추천 인터페이스 메소드를 대체 할 수 없다는 말이 있습니다. 이게 합리적입니까? –

+0

"허용되지 않음"에 대해서는 알지 못합니다.하지만 실제로는 비추천 함수를 무시하고 있기 때문에 그것에 대해 불평 할 것이라고 생각합니다. 이들을 분리하여 두 개의 완전히 다른 인터페이스로 만들거나 Derived가 다른 기능을 확장해야하는 방법이 있습니까? – MattC

-1

원하는 것을 성취 할 수있는 방법이 없습니다.

지원 중단은 비교적 간단한 메커니즘이며이 사용 사례를 지원하지 않습니다.

deprecation이 작동하는 방식은 사용되지 않는 메소드 또는 필드를 참조하는 모든 것이 경고를 생성한다는 것입니다.

유일한 예외는 비추천 메소드/필드를 사용하는 코드가 더 이상 사용되지 않는 경우입니다.

+0

그리고 더 이상 사용되지 않는 API에서 파생 된 메서드를 사용하기 때문에 경고가 표시되지 않고 올바른 반응입니다. – Mnementh

+0

'Derived '에 메서드를 도입 할 때 메서드를'Base'에서'Derived'로 마이그레이션하는 것이므로'Base' 메서드를 더 이상 사용하지 말고 "Derived"에서이 메서드를 사용하는 설명서를 제공하고 싶습니다. . 이 시나리오에서 (파생 된) 메소드에 대해 (새로 추가 된) 메소드를 사용하지 않는 것은 이해가되지 않습니다. –

+0

내가 "이 사용 사례를 지원하지 않습니다."라고 말한 이유는 무엇입니까? –

3

@Deprecated를 Foo()의 파생 선언에 추가하면 경고가 사라집니다.

public interface Derived extends Base { 
    @Deprecated void Foo(); 
} 
+0

이 대답을 받아 들여야합니다. –

관련 문제