이 규칙은 여전히 원시 유형을 사용하는 레거시 코드에서 충돌을 피하기위한 것입니다.
다음 은 JLS에서 가져온 것이 허용되지 않는 이유를 보여줍니다 . 제네릭이 Java에 도입되기 전에 다음과 같은 코드를 작성했다고 가정 해보십시오.
class CollectionConverter {
List toList(Collection c) {...}
}
다음과 같이 내 수업을 확장하십시오.
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
제네릭을 도입 한 후 라이브러리를 업데이트하기로 결정했습니다.
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
업데이트 할 준비가되지 않았으므로 Overrider
수업을 내버려 두십시오 . 이 toList()
방법 을 올바르게 재정의하기 위해 언어 디자이너는 원시 유형이 생성 된 유형과 "재정의"한다고 결정했습니다. 즉, 메소드 서명이 더 이상 공식적으로 내 슈퍼 클래스의 서명과 같지 않지만 메소드는 여전히 재정의됩니다.
이제 시간이 흐르면서 수업을 업데이트 할 준비가되었습니다. 그러나 약간 망쳐 놓고 기존의 원시 toList()
메소드 를 편집하는 대신 다음과 같은 새로운 메소드 를 추가 하십시오.
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
원시 유형의 재정의 동등성으로 인해 두 메소드 모두 메소드를 대체 할 수있는 올바른 형식 toList(Collection<T>)
입니다. 그러나 물론 컴파일러는 단일 방법을 해결해야합니다. 이러한 모호성을 제거하기 위해 클래스는 재정의와 동등한 여러 메소드, 즉 삭제 후 동일한 매개 변수 유형을 가진 여러 메소드를 가질 수 없습니다.
핵심은 이것이 원시 유형을 사용하여 이전 코드와의 호환성을 유지하도록 설계된 언어 규칙이라는 것입니다. 타입 파라미터의 소거에 의해 요구되는 제한은 아니다; 메서드 확인시 컴파일시 발생하기 때문에 메서드 식별자에 일반 형식을 추가하면 충분합니다.