我正在使用使用 Java 11 構建的微服務,該服務具有在 Java 8 中構建的依賴項。依賴項中有休息客戶端,并且有一個方法可以執行此操作: public <T> ResponseEntity<my.company.Wrapper<T>> getForList(String url, HttpHeaders headers) { try { return template.exchange(url, GET, new HttpEntity<>(headers), new ParameterizedTypeReference<Wrapper<T>>() { }); } catch (RestClientException restEx) { logger.error("RestClientException!, restEx: {}", restEx); throw restEx; } }休息通話剛剛成功, response -> <200,Wrapper [ elements = [{id=dbfc2557-1738-45e4-8ecd-235d35158957, .....然后,在微服務(使用 Java 11)中,有一個點需要使用 java Stream: var found = enttsResponse.stream() .map(MyCompanyResponse::getId) .collect( toList() );異常消息是:java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.mycompany.commons.v2.entitlement.MyCompanyResponse (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.mycompany.commons.v2.entitlement.MyCompanyResponse is in unnamed module of loader 'app')我熟悉Java8,但不熟悉Java 11,我認為與類加載器有關(來自Java 9)解決方法已接受,提前致謝!
1 回答

滄海一幻覺
TA貢獻1824條經驗 獲得超5個贊
您有一個 形式的類型標記new ParameterizedTypeReference<Wrapper<T>>() { }
,引用類型變量。由于類型擦除(這種類型標記首先存在的原因),這不起作用。
接收類型令牌的框架只會知道它必須生成一個Wrapper
,但仍然不知道是什么T
。所以它不知道要生成什么并且會回退到集合(即LinkedHashMap
)。
您必須用引用已知可具體化類型的表達式替換泛型方法的調用者,即
template.exchange(uriBuilder.toUriString(),?GET,?new?HttpEntity<>(headers), ????new?ParameterizedTypeReference<Wrapper<EntitlementResponse>>()?{?})
添加回答
舉報
0/150
提交
取消