2012-03-16 3 views
3

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 (개체) 재정의하거나 구현해야한다고 컴파일 오류가 왜 그것을 알아낼 수 없습니다 슈퍼 타입 메소드.

답변

4

CollectionConverter에서 method4의 서명은 당신함으로써 Integer에 형식 매개 변수 U 바인딩, CollectionConverter<Integer>을 구현하기 위해 Overrider를 선언

Comparable<U> method4(U u); 

입니다 .

Comparable<Integer> method4(Integer u); 

당신은 method4(Object u)Overrider에서 선언 할 수 있지만, 그 방법 서명은 인터페이스에 지정된 method4(Integer u)을 무시하지 않는다 당신은 모든 제네릭을 사용하지 않은 경우는 것보다 더 : 서명은 다음이된다.

+0

그러나 삭제 후에는 모든 유형 매개 변수가 Object 또는 "extends"목록의 첫 번째 바운드로 대체됩니다. 처음 세 메소드와 마찬가지로, 삭제 후 처음 세 메소드의 서명은 Overrider 클래스의 서명과 완전히 동일합니다. 이 리드에 이어 method4의 서명 및 반환 유형은 다음과 같아야합니다. 오버라이드에있는 것과 동일한 Comparable method4 (Object u). 그래서, 제 질문입니다 –

+0

@RobyYan - 제네릭은 최소 상한에서 다운 캐스팅을위한 구문 설탕이 아닙니다. 컴파일러는 형식 안전성을 검사합니다. generics에 대한 전체적인 생각은 컴파일러가 타입 검사를 할 수 있도록하는 것입니다. 타입 삭제가 이미 적용된 것처럼 컴파일러가 분석을 수행하도록하는 것은 절망적 일 것입니다. 그것이 작동하도록 남겨진 것이 거의 없을 것입니다. –

+0

"제네릭에 대한 전반적인 생각은 컴파일러가 타입 검사를 할 수 있도록하는 것입니다. 컴파일러가 타입 지우기가 이미 적용된 것처럼 분석을 수행하게하는 것은 절망적 일 것입니다. . " 알았어. 제네릭의 원래 목적을 거의 잊어 버렸다. 대답 해줘서 고마워. –

1

인터페이스에서 method4는 인터페이스 (U)와 동일한 유형 매개 변수로 선언 되었기 때문에 그것을 다른 것으로 변경하면 효과가 있습니다. 예

<A> Comparable<A> method4(A a); 
2

시킨 문제

U 가변 타입 Integer 그 시점에서 결합된다. 당신이

public Comparable method4(Integer u) ... 

에 선언을 변경하는 경우는 오버라이드에게 있습니다

관련 문제