복붙노트

[SPRING] 파라미터 화 된 형태를 선택할 수 없습니다

SPRING

파라미터 화 된 형태를 선택할 수 없습니다

나는 서버와 클라이언트 사이의 통신에 휴식을 만들려고합니다.

생성자는 다음과 같다 :

public class RestHelper<I, R> {
    public RestHelper(String url, I input, Class<R> output){
        ResponseEntity<R> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, output );
    }
}

일반형, 나는 할 수있다 :

RestHelper<User, Result> helper = new RestHelper<>(url, user, Result.class);

어떻게 같은 제네릭 형식을 전달할 수 있습니다 :

ResultContainData<Boolean>

아래의 코드가 작동하지 않습니다 :

    ResultContainData<Boolean> result = new ResultContainData<>();
    RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>) ((ParameterizedType) result.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);

나는 런타임 오류가 발생했습니다 :하는 ParameterizedType으로 캐스팅 할 수 없습니다.

해결법

  1. ==============================

    1.나는 해결책을 얻었다.

    나는 해결책을 얻었다.

    ResultContainData<Boolean> result = new ResultContainData<>();
    RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>)result.getClass());
    

    그것은 나를 위해 일하고있다. 나는 아직도 더 나은 솔루션을 찾고 있어요.

  2. ==============================

    2.그렇지 않으면 런타임에 지워집니다 - 당신은 서브 클래스 정의를 캡처하여 I와 R의 가치를 배울 수 있습니다. 전의:

    그렇지 않으면 런타임에 지워집니다 - 당신은 서브 클래스 정의를 캡처하여 I와 R의 가치를 배울 수 있습니다. 전의:

    class MyStringRestHelper extends RestHelper<String, String> {
    

    그럼 당신은 I와 R의 값을 확인할 수 TypeTools 같은 것을 사용 :

    Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RestHelper.class, MyStringRestHelper.class);
    Class<?> i = typeArgs[0];
    Class<?> r = typeArgs[1];
    assert i == r == String.class;
    
  3. from https://stackoverflow.com/questions/27000227/cannot-select-parameterized-type by cc-by-sa and MIT license