원시 유형 매개 변수로 메소드를 재정의 할 때 확인되지 않은 경고를 피할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/241539

문제

변경할 수없는 라이브러리에서 정의 된 수업을 확장하고 있습니다.

public class Parent
{
    public void init(Map properties) { ... }
}

부모를 확장하고 제네릭과 함께 Java 6을 사용하는 클래스 '자녀'를 정의하고 있다면, 선택되지 않은 경고를받지 않고 Init 메소드를 무시하는 가장 좋은 방법은 무엇입니까?

public class Child extends Parent
{
    // warning: Map is a raw type. References to generic type Map<K,V> should be parameterized
    public void init(Map properties) { }
}

일반 매개 변수를 추가하면 다음을 얻습니다.

   // error: The method init(Map<Object,Object>) of type Child has the same erasure as init(Map) of type Parent but does not override it
   public void init(Map<Object,Object>) { ... }
   // same error
   public void init(Map<? extends Object,? extends Object>) { ... }
   // same error
   public void init(Map<?,?>) { ... }

이 오류는 특정 유형, 경계 와일드 카드 또는 무한 와일드 카드를 사용하는지 여부에 관계없이 발생합니다. 경고없이 @suppresswarnings ( "선택 취소")를 사용하지 않고 비 게 니체 방법을 무시하는 정확하거나 관용적 인 방법이 있습니까?

도움이 되었습니까?

해결책

예, 제네릭 정보를 추가하지 않고 상위 클래스와 동일한 서명으로 우선적 인 메소드를 선언해야합니다.

가장 좋은 방법은 추가하는 것입니다 @SuppressWarnings("unchecked") 메소드가 아닌 원시 유형 매개 변수에 대한 주석이 있으므로 자신의 코드에 가질 수있는 다른 제네릭 경고를 낭비하지 않을 것입니다.

다른 팁

짧은 대답 : 그렇게 할 방법이 없습니다.

만족스럽지 않은 답변 : IDE/Build.xml에서 (특정) 경고를 비활성화합니다.

라이브러리를 변경할 수 없다면 아아 아아아이지 않은 방법을 고수해야합니다.

문제는 유형 후 삭제 후에도 init ()가 동일한 서명을 가지고 있지만 실제로는 다른 방법 일 수도 있고 (*)가 될 수 있다는 것입니다. 컴파일러는 재정의 또는 과부하가 발생하면 알 수 없으므로 금지됩니다.

(*) 도서관 개발자가 init (Map)를 의미한다고 가정합니다.u003CString,Integer> ). 이제 init (지도u003CString,String> ). 이것은 과부하이며, 두 가지 방법이 vtable of Child Class에 존재해야합니다.

그러나 도서관 개발자가 init (지도를 의미한다면 어떨까요?u003CString,String> )? 그러면 그것은 무시하고 방법이 있어야합니다 바꾸다 아동 수업의 원래 초기, 그리고 vtable of child에는 단 하나의 방법이 있습니다.

추신 : 나는 제네릭이 Java에서 어떻게 구현되었는지를 싫어합니다 :-(

위의 대답은 대신 @suppresswarnings ( "rawtypes")를 말하는 것을 의미한다고 생각합니다.

부모와 동일한 서명으로 메소드를 선언해야하므로 컴파일 할 때 경고를 받게됩니다. @suppresswarnings로 그들을 억제 할 수 있습니다 ( "확인되지 않은")

이것을 제거 할 방법이없는 이유는 경고가 유효하지 않은 유형의 컬렉션을 만들 수 있음을 알려주는 경고가 있기 때문입니다. 이를 허용 할 수있는 모든 코드가 제거 될 때만 경고는 사라져야합니다. 비 게 릭 클래스에서 상속되기 때문에 항상 잘못된 내용이있는 컬렉션을 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top