2017-09-04 1 views
1

제네릭 형식과 와일드 카드 형식의 차이점은 무엇입니까? 그러나이 상황에서는 다시 같은 방식으로 이해할 수 없습니다. 가 (사용자가 엔터티를 확장)제네릭 형식과 와일드 카드 형식 간의 결과가 다른 이유는 무엇입니까

Message<User> message = requestParser.parseRequest(json); 
: 짧은

는 첫 번째 하나는 아래의 코드를 컴파일 할 수 있습니다

public interface RequestParser { 
    <T extends Entity> Message<T> parseRequest(String json); 
} 


public interface RequestParser { 
    Message<? extends Entity> parseRequest(String json); 
} 

아래 두 인터페이스를 비교하려면

와일드 카드를 사용합니다 ? 성공할 수 없습니다.

그래서이 상황에서 이들 사이의 차이점은 무엇입니까 ...?

+2

가능한 중복 (생산자는 소비자 슈퍼를 확장)? ] (https://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super) – Flown

+0

이 경우 생성 된 값을 사용하고자하기 때문에 소비자이기도합니다 (복제본에 링크되어 있음).) – Flown

+0

죄송합니다. PECS는 전에 들어 본 적이없는 용어입니다. 감사합니다. –

답변

1

Message<User>Message<? extends Entity>의 하위 클래스가 아니기 때문입니다.

RequestParser을 구현하려고하면이 문제가 더 분명해질 것입니다. T

이 캐스팅없이 실패합니다

는 반드시 AnotherUser되지 않습니다 :이 반면

public class AnotherUser extends Entity {} 

public class RequestParserImpl implements RequestParser { 
    <T extends Entity> Message<T> parseRequest(String json) { 
     return new Message<AnotherUser>(); 
    } 
} 

는 컴파일 : [PECS 무엇의

public class RequestParserImpl implements RequestParser { 
    Message<? extends Entity> parseRequest(String json) { 
     return new Message<AnotherUser>(); 
    } 
} 
관련 문제