2014-02-11 2 views
1

제가 작업하고있는 코드 조각에 제네릭을 추가하는 데 문제가 있습니다. 검색 한 적이 없으며 지금까지 본 예제 중 아무 것도 검색하지 못했습니다. 그렇게하려고하면 도움을 청할거야.자바 메서드에서 제네릭을 사용하는 방법

현재 나는 그들의 ID의 인구가 UserDTO 개체의 목록을 처리하고 편안한 웹 서비스에서 각 User의 전체 세부 사항을 얻을이 코드가있다 :

//userIds and userDetails declared previously 
for (UserDTO user : userIds) { 
    UserDTO populatedUser = webResource.path(REST_USER_PATH).path(user.getId(). 
     toString()).type(MediaType.APPLICATION_XML).get(ClientResponse.class). 
      getEntity(UserDTO.class); 

    userDetails.add(populatedUser); 
} 

이제이 될 것입니다 현재 착수하고있는 작업을위한 패턴으로, ID가 채워진 DTO 개체 목록을 웹 서비스 호출을 통해 완전히 채워진 DTO 개체 목록으로 변환 할 수 있어야합니다. 내가하고 싶은 것은 이것을 가능하게하는 일반적인 방법을 만드는 것입니다.

내가 확장을 위해이 작업을 수행 할 필요가 모든 다른 DTO 객체는 그래서 불행하게도이 컴파일되지 않습니다, 다음과 함께했다 BaseDTO 우리 만 잘하면 내가 달성하기 위해 노력하고있어 표시됩니다 :

public <T extends BaseDTO> getListOfPopulatedDTOs(
     List <T extends BaseDTO> unpopulatedDTOs, String restPath) { 

     List<BaseDTO> populatedDTOs = new ArrayList<BaseDTO>(); 

     for (BaseDTO unpopulatedDTO : unpopulatedDTOs) { 
      BaseDTO populatedDTO = webResource.path(restPath).path(
       unpopulatedDTO.getId().toString()).type(MediaType.APPLICATION_XML). 
        get(ClientResponse.class).getEntity(T.class); 

      populatedDTOs.add(populatedDTO); 
     } 

     return populatedDTOs; 
    } 

도움이나 조언을 보내 주시면 감사하겠습니다. 미리 감사드립니다.

+0

당신이 컴파일 오류를 공유 할 수 (목록이 null 또는 0 크기 확인) 할 수 있습니까? – mikemil

+1

내가 궁금한 점은 - 일반적인 질문이 필요한 경우 - 어떻게 메소드에 하드 코딩 된 'ClientResponse.class'를 제거 할 수 있었습니까? 어떤 유형의 clazz 나 좀 더 일반적인 것이 필요하지 않습니까? 아니면 ClientResponse가 응답 데이터의 '기본'클래스입니까? – mikemil

답변

1

형식 매개 변수에서 범위를 다시 지정할 필요가 없습니다. 또한 T.class은 유효하지 않습니다. 메서드에 명시 적으로 Class<T>을 전달해야합니다. 당신은 이런 식으로 방법을 변경할 수 있습니다

public <T extends BaseDTO> List<T> populateDTOList(List<T> unpopulatedDTOs, Class<T> clazz, String restPath) { 
    List<T> populatedDTOs = new ArrayList<T>(); 

    for (T unpopulatedDTO : unpopulatedDTOs) { 
     T populatedDTO = webResource.path(restPath) 
          .path(unpopulatedDTO.getId().toString()) 
          .type(MediaType.APPLICATION_XML) 
          .get(ClientResponse.class) 
          .getEntity(clazz); 

     populatedDTOs.add(populatedDTO); 
    } 

    return populatedDTOs; 
} 

그냥 당신이 유형 BaseDTO에 선언 된 getId() 방법이 있는지 확인하십시오, 그렇지 않으면 당신은 그것을 액세스 할 수 없습니다.

또한 메소드의 반환 유형이 누락되었습니다. 나는 그것을 여기에 넣었다. 그리고이 방법의 이름은 populateDTOList입니다. 사용자가 입력 한 정보를 하나의 time.In 일반적인 방법을 선언 할 필요가

+0

내가 궁금한 점은 - 일반적인 질문을 원한다면 - 어떻게 메소드에서 하드 코딩 된 'ClientResponse.class'를 제거 할 수 있겠습니까? 어떤 유형의 clazz 나 좀 더 일반적인 것이 필요하지 않습니까? 아니면 ClientResponse가 응답 데이터의 '기본'클래스입니까? – mikemil

+0

@mikemil 좋은 질문입니다. 우리는 OP에서 답을 얻을 수 있도록 질문 자체에 게시해야합니다. –

+0

답장을 보내 주셔서 감사합니다. 빠른 답변을 보내 주셔서 감사드립니다. Rohit의 대답은 가장 완벽하게 보입니다. 그러나이 메서드를 호출하는 데 문제가 있습니다. 내가 질문에 추가 정보를 게시 할 것입니다. 다시 한 번 감사드립니다! – Drew

0

, 당신은 TEH 반환 형식하기 전에이 작업을 수행 아니라 매개 변수는이로 변경 itself.Just : -

public <T extends BaseDTO> getListOfPopulatedDTOs(List <T> unpopulatedDTOs, String restPath) { 
List<BaseDTO> populatedDTOs = new ArrayList<BaseDTO>(); 

for (BaseDTO unpopulatedDTO : unpopulatedDTOs) { 
    BaseDTO populatedDTO = webResource.path(restPath).path(unpopulatedDTO.getId().toString()).type(MediaType.APPLICATION_XML) 
     .get(ClientResponse.class).getEntity(T.class); 

    populatedDTOs.add(populatedDTO); 
} 

return populatedDTOs; 
0

제네릭 컴파일 시간 검사 만합니다. 따라서 T.class을 수행 할 수 없습니다. T 및 기타 모든 일반 정보가 컴파일 중에 제거되기 때문입니다.

귀하의 인터페이스는 같은 수 :

public <T extends BaseDTO> List<T> getListOfPopulatedDTOs(List <T> unpopulatedDTOs, String restPath) 

을 그리고 당신은 getEntity(unpopulatedDTOs.get(0).getClass())

관련 문제