2008-10-27 6 views
14

변경할 수없는 라이브러리에 정의 된 클래스를 확장하고 있습니다.raw 형의 파라미터를 가지는 메소드를 오버라이드 (override) 할 때, 체크되지 않는 경고를 피할 수 있습니까?

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

부모를 확장하는 'Child'클래스를 정의하고 있으며 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 ("unchecked")를 사용하지 않고 경고없이 비 제네릭 메서드를 재정의 할 수있는 정확하고 관용적 인 방법이 있습니까?

답변

12

예, 당신은 어떤 제네릭 정보를 추가하지 않고, 부모 클래스에서와 동일한 서명을 최우선 방법을 선언해야합니다.

내가 가장 좋은 건에 생각 메소드가 아닌 원시 타입 매개 변수에 @SuppressWarnings("unchecked") 주석을 추가하십시오. 따라서 자신의 코드에서 가질 수있는 다른 제네릭 경고를 줄이지 마십시오.

+0

@SuppressWarnings가 가장 좋은 방법입니다. 하지만 제네릭을 사용하지 않는 라이브러리에 제네릭을 강제로 넣으려고 할 때 일어나는 일입니다. –

+0

'@SuppressWarnings ("rawtypes")'도 충분해야합니다. –

2

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

불만족 답변 : IDE/build.xml에서 (특정) 경고를 비활성화하십시오.

라이브러리를 변경할 수 없다면, 비 일반적인 방법을 고수해야합니다.

유형 삭제 후에도 init() 둘 다 동일한 서명을 갖지만 실제로는 다른 메소드 또는 동일한 (*) 일 수 있습니다. 컴파일러는 오버라이드 또는 과부하가 필요한지 여부를 알 수 없으므로 금지되어 있습니다.

(*) 라이브러리 개발자가 init (Map < 문자열, 정수 >)을 의미한다고 가정합니다. 이제 init (Map < String, String >)을 구현하고 있습니다. 이것은 오버로딩이며 Child 클래스의 vtable에는 두 가지 메소드가 있어야합니다.

그러나 라이브러리 개발자가 init (지도 < 문자열, 문자열 >)을 의미한다면? 그럼 우선하고, 당신의 메소드는 이 자식 클래스의 원래 init을 대체해야하고 자식의 vtable에는 하나의 메소드 만 있어야합니다.

P. 나는 제네릭

:-(자바로 구현 얼마나 싫어
+0

동일한 (지워진) 서명이있는 메서드가 컴파일러의 다른 메서드가 될 수있는 이유를 설명해 주실 수 있습니까? 컴파일러는 개발자가 무엇을 코딩하는지 알지 못합니다. ;-) – nrainer

0

부모와 동일한 서명으로 메소드를 선언해야하며, 따라서 컴파일 할 때 경고 메시지가 표시됩니다 @SuppressWarnings을 사용하여 경고를 표시하지 않을 수 있습니다 ("선택 취소")

제거 할 방법이없는 이유는 유효하지 않은 유형의 콜렉션을 작성할 수 있다는 경고가 있다는 것입니다. 경고는 해당 코드를 허용 할 수있는 모든 코드가 제거 된 경우에만 사라져야합니다. 비 제네릭 클래스를 상속하므로 잘못된 내용으로 컬렉션을 만들 수 있습니다.

2

위의 대답은 @SuppressWarnings ("rawtypes") 대신 사용한다고 생각합니다.