JLS (Java Language Specification)에서 : 서브 서명의 개념은 서명이 동일하지 않지만 다른 하나를 대체 할 수있는 두 메소드 간의 관계를 표현하도록 설계되었습니다. 특히 서명이 제네릭 형식을 사용하지 않는 메서드가 해당 메서드의 생성 된 버전을 재정의 할 수있게합니다. 처음 3 가지 방법이 잘 작동하는 이유오버라이드 (override) 제네릭 메소드
interface CollectionConverter<U> {
<T> List<T> toList(Collection<T> c);
void fooMethod(Class<?> c);
<E>Comparable<E> method3(E e);
Comparable<U> method4(U u);
}
class Overrider implements CollectionConverter<Integer> {
@Override
public List toList(Collection c) {
return null;
}
@Override
public void fooMethod(Class c) {
}
@Override
public Comparable method3(Object o) {
return null;
}
@Override
// compile error, have to change Object to Integer
public Comparable method4(Object u) {
return null;
}
}
는 JLS에 따르면, 나는 이해하지만 method4 유형의 Overrider의 방법 method4 (개체) 재정의하거나 구현해야한다고 컴파일 오류가 왜 그것을 알아낼 수 없습니다 슈퍼 타입 메소드.
그러나 삭제 후에는 모든 유형 매개 변수가 Object 또는 "extends"목록의 첫 번째 바운드로 대체됩니다. 처음 세 메소드와 마찬가지로, 삭제 후 처음 세 메소드의 서명은 Overrider 클래스의 서명과 완전히 동일합니다. 이 리드에 이어 method4의 서명 및 반환 유형은 다음과 같아야합니다. 오버라이드에있는 것과 동일한 Comparable method4 (Object u). 그래서, 제 질문입니다 –
@RobyYan - 제네릭은 최소 상한에서 다운 캐스팅을위한 구문 설탕이 아닙니다. 컴파일러는 형식 안전성을 검사합니다. generics에 대한 전체적인 생각은 컴파일러가 타입 검사를 할 수 있도록하는 것입니다. 타입 삭제가 이미 적용된 것처럼 컴파일러가 분석을 수행하도록하는 것은 절망적 일 것입니다. 그것이 작동하도록 남겨진 것이 거의 없을 것입니다. –
"제네릭에 대한 전반적인 생각은 컴파일러가 타입 검사를 할 수 있도록하는 것입니다. 컴파일러가 타입 지우기가 이미 적용된 것처럼 분석을 수행하게하는 것은 절망적 일 것입니다. . " 알았어. 제네릭의 원래 목적을 거의 잊어 버렸다. 대답 해줘서 고마워. –